如果基础数据可以更改,如何管理来自超媒体驱动 RESTful API 的分页结果?

How can paginated results from a hypermedia driven RESTful API be managed if the underlying data can change?

我正在创建一个超媒体驱动的 RESTful API,它将用于查询交易数据。目的是对结果进行分页。

每个 API 调用都会查询一个索引数据库 table。由于内存方面的考虑,我不想保留结果服务器端,所以我想根据请求的页面检索基于行数的数据。例如。在第一页,WHERE rownum <= 10,在第二页,WHERE rownum BETWEEN 11 AND 20

但是,有问题的数据库是从生产系统复制的,并且可能会将记录添加到已请求的结果集中的区域中。例如。请求第一页 -> 返回 10 行 -> 在第 5 行插入一个事务。现在第二页将包含一条已经显示在第一页上的记录,因为结果实际上是由行数向上推的。

什么是实现我的 objective 创建超媒体驱动 RESTful API 的好方法,它提供来自数据库的分页事务数据,而不保留结果集在 session?

期间

这是一个比较普遍的问题,其实解决方法并不多。 实际上我只能想到三个:

  • 你不在乎,结果就会改变。这是 Whosebug 的行为:如果您在问题页面的第 2 页上并且有人发布了一个新问题,则在单击第 3 页时您可能会看到一个或多个已在第 2 页上列出的问题,因为索引已经转移了。

  • 如果您不想在内存中保留实际数据,您会遇到很多麻烦。您可以存储结果集的处理程序,而不是结果本身,然后循环获取您实际需要的行数。例如。您 运行 select,获取 10 行并存储结果集的处理程序。与行一起,您 return 向客户端查询一个唯一的 ID。问题是当你指定了一个范围时,因为你不能真正 "rewind" 一个数据库游标,这意味着缓存结果,你可能无论如何都想这样做。但如果你这样做,迟早你会把所有的结果都记在记忆中。

  • 您仍然可以使用一些内存,但只保留行的一些唯一标识符,与查询的唯一标识符相关联,如上所述。这可能有效,但前提是可以添加行,而不是删除或更新行(如果更新,它们可能不再匹配查询)。

就个人而言,我会选择选项 1。