gpt4 book ai didi

pagination - 构建分页游标

转载 作者:行者123 更新时间:2023-12-03 23:42:54 28 4
gpt4 key购买 nike

我有存储在图形数据库中的事件。在某些情况下,多个事件被分组并聚合为 1 个事件。

处理后的事件提要可能如下所示:

Activity 1

Activity 2

Grouped Activity
Activity 3
Activity 4

Activity 5
  • 事件具有更新的时间戳和唯一的 ID。
  • 事件按其更新时间排序,如果是分组事件,则使用其子事件中最近更新的时间。
  • 事件可以插入列表中的任何位置(例如,如果我们开始关注某人,他们过去的事件将被插入到列表中)。
  • 可以从列表中的任何位置删除事件。
  • 由于数据量的原因,使用带微秒的时间戳仍然会导致冲突(2个项目可以具有相同的时间戳)。
  • 游标标识符应该是唯一且稳定的。添加和删​​除提要项目不应更改标识符。

  • 我想引入基于光标的分页,以允许客户通过类似于 twitter's 的提要进行分页。 .似乎没有太多关于它们是如何构建的信息,因为我只找到了这个 blog post谈论实现它​​们。但是,如果光标的标识符恰好指向已删除的项目,则似乎有问题。

    有了上述内容,我如何生成可用作上述内容的游标的标识符?最初,我考虑将时间戳与唯一 ID 结合起来: 1371813798111111.myuniqueid .但是,如果项目位于 1371813798111111.myuniqueid已删除,我可以使用 1371813798111111 获取项目时间戳,但无法确定我应该从哪个带有该时间戳的项目开始。

    我采用的另一种方法是为每个提要结果分配一个递增的数字。由于数字是按顺序递增的,如果缺少数字/id,我可以选择下一个。但是,这样做的问题是,如果我开始在提要中间删除和添加提要项目,则光标 ID 会发生变化。我对这个问题的一个解决方案是在每个数字之间有一个巨大的差距,但很难确定如何以一种确定性的方式将新项目添加到每个数字之间的空间中。此外,随着新项目的添加,以及填补空白,我们最终会遇到同样的问题。

    简单地说, 如果我有一个项目列表,其中可以从列表中的任何位置添加和删除项目,那么为每个列表项目生成 id 的最佳方法是什么,这样如果 id 的项目被删除,我仍然可以确定它的位置在列表中 ?

    最佳答案

    您需要有额外的(或现有的)列,这些列对于目标表的每个新添加的行依次增加。我们把这个专栏叫做 seq_id .

    当客户端第一次请求游标时:

    GET /api/v1/items?sort_by={sortingFieldName}&size={count}

    其中 sortingFieldName 是我们应用排序的字段名称

    幕后发生了什么:
    SELECT * FROM items
    WHERE ... // apply search params
    ORDER BY sortingFieldName, seq_id
    LIMIT :count

    回复:
    {
    "data": [...],
    "cursor": {
    "prev_field_name": "{result[0].sortingFieldName}",
    "prev_id": "{result[0].seq_id}",
    "nextFieldName": "{result[count-1].sortingFieldName}",
    "next_id": "{result[count-1].seq_id}",
    "prev_results_link": "/api/v1/items?size={count}&cursor=bw_{prevFieldName}_{prevId}",
    "next_results_link": "/api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}"
    }
    }

    如果我们检索的行数少于 count 行,则不会出现光标的下一个响应。

    如果我们在请求中没有游标或没有要返回的数据,则游标的前一部分将不会出现在响应中。

    当客户端再次执行请求时 - 他需要使用游标。前进光标:
    GET /api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}

    幕后发生了什么:
    SELECT * FROM items
    WHERE ... // apply search params
    AND ((fieldName = :cursor.nextFieldName AND seq_id > :cursor.nextId) OR
    fieldName > :cursor.nextFieldName)
    ORDER BY sortingFieldName, seq_id
    LIMIT :count

    或向后光标:
    GET /api/v1/items?size={count}&cursor=fw_{prevFieldName}_{prevId}

    幕后发生了什么:
    SELECT * FROM items
    WHERE ... // apply search params
    AND ((fieldName = :cursor.prevFieldName AND seq_id < :cursor.prevId) OR
    fieldName < :cursor.prevFieldName)
    ORDER BY sortingFieldName DESC, seq_id DESC
    LIMIT :count

    响应将与上一个类似

    关于pagination - 构建分页游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17234203/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com