GraphQL 分页:光标与偏移量

GraphQL pagination: cursor vs offset

我们必须重建一个基于 REST 服务的后端应用程序,由于我们在服务中有很多嵌套级别,我们决定创新并尝试 GraphQL。

我们开始做一些简单的事情,这个项目看起来很有前途,但是我们开始面临分页等现实世界的问题。在 REST 中,分页方法很简单,我们使用 GET 方法和一些参数,如 pageSizepageNumber(或 offset),我们构建 sql 查询来执行此分页。

在 GraphQL 中,我们按照相同的方法解决问题,例如有这个查询:

users(size:5 offset:2) {
  id
  name
}

这种方法看起来很容易实现,但是在深入挖掘之后我们发现实现它的 "best" 模式是连接模式,查询看起来像这样:

users(first:2) {
  totalCount
  edges {
    node {
      name
    }
    cursor
  }
  pageInfo {
    endCursor
    hasNextPage
  }
}

我们的数据保存在关系数据库中,因此我看不到游标有何帮助(除非我使用自动增量 ID?)。

为什么推荐使用这种复杂的方法而不是简单的方法?还有什么 cursor 和 endCursor 将被存储?我是否误解了我的学习路径?

Connection 规范最初是为 Relay(Facebook 的 GraphQL 客户端)创建的。它后来发展了自己的生命,现在被认为是 最佳实践 ,无论客户如何。但是(这是一个巨大的 ),它绝对不能很好地映射到每个用例。

如果您看到实施 Connection 分页样式的价值,您有 2 个选择:

1) 将 after 视为偏移量(意味着将传递一个数字),并将 first 视为限制:

SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first

beforelast相同,只是方向不同。

2) 另一种方法是将 after/before 视为排序列的最后一次看到的值(因此将传递实际(混淆)值):

SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first

就是说,如果您没有从 Connection 方法中获益,请随意忽略它。特别是如果您甚至不使用 Relay 作为客户端。这是一个完全可选的东西,不应该被塞进它不属于的地方。