keel
管理员

游标分页 vs 偏移分页

后台用 page/pageSize,官网用 cursor/limit。同一个项目里两种分页并存,是因为它们要解决的问题不同。

后台要跳页(直接翻到第 7 页)、要显示总数、数据也不怎么会在你翻页时插进来 —— 偏移分页刚好。 官网不一样:文章是持续发布的,访客翻到第二页时前面可能已经多了一篇,偏移分页会让他重复看到一条、漏掉一条。而且 count 在数据量大之后是笔实打实的开销,官网列表并不需要它。 游标分页有一个必须写对的细节:排序键要能唯一确定顺序。只按 publishedAt 排,两篇同一时刻发布的文章顺序是不确定的,游标会翻回同一条或跳过一条。所以 orderBy 是 publishedAt + id 两级。 另一个细节是「有没有下一页」只能看 nextCursor 是不是 null,不能用 items.length < limit —— 最后一页刚好装满时后者会漏掉一次判断。