无限滚动/数据分页和不同步页面结果

时间:2015-07-27 12:36:10

标签: paging infinite-scroll

我即将在网络应用中开发无限滚动项目(这只是分页项目的特定用户体验),但我有点困惑如何处理新项目的添加问题一个用户滚动/翻阅项目。我们如何处理这些未同步的数据?

假设我打开页面数据库时有100个项目。

  1. 用户1 导航到请求前10个项目并显示它们的页面
  2. 用户1 然后开始滚动,并在页面请求接下来的10个项目时达到一个点
  3. 用户2 添加新项目,因此数据库现在有101个项目
  4. 用户1 滚动请求下10个项目。
  5. 后端会发生什么?

    1. 如果用户向下滚动,我们可以从最后一个ID上请求10个项目
    2. 如果用户向上滚动,我们会要求前10个项目,但现在还有另一个项目在顶部吗?
    3. 这是如何解决的?甚至在Stackexchange网站上,当用户浏览问题页面时,内容被分页并流缓存更改?

        

      这个问题应该问程序员吗?我不确定......

1 个答案:

答案 0 :(得分:0)

通过提供

传统上不进行分页,最容易解决这个问题
  • 页面索引和
  • 页面大小,

而是提供

  • 上次显示的记录ID
  • 页面大小

这称为键集分页键搜索方法分页。两者通常都需要额外的参数,如排序和过滤,但这两种技术都相似,所以它与这个答案无关。

这可以防止在将新项目添加到列表顶部时返回无效页面,但它也有一个缺点,就是不能让您跳转页面(即获取第10页,而我们正在查看页面5)。但这就是为什么在特定情况下使用它,例如无限滚动,这个问题不存在甚至不需要。

请参阅性能比较以及有关键搜索方法的许多解释:
http://use-the-index-luke.com/sql/partial-results/fetch-next-page

基本上我们想要做的就是沿着这些方向做某事(假设我们按时间顺序按相反顺序排序并假设 CreateDate 具有如此高的精度以至于它被认为是唯一的):

with LastRecord
as (
    select CreatedDate
    from Records
    where Id = @LastRecordId
)
select r.*
from Records r, LastRecord l
where r.CreatedDate < l.CreatedDate
offset 0 rows
fetch first @PageSize rows only;