为了账号安全,请及时绑定邮箱和手机立即绑定

GraphQL 分页:游标 vs 偏移

GraphQL 分页:游标 vs 偏移

aluckdog 2021-07-11 20:07:02
我们必须重建基于 REST 服务的后端应用程序,并且由于我们在服务中有很多嵌套级别,因此我们决定创新并尝试 GraphQL。我们开始做一些简单的事情,这个项目看起来很有前途,但是我们开始面临分页等现实世界的问题。在 REST 中,分页方法很简单,我们使用 GET 方法和一些参数,如pageSizeand pageNumber(or offset) 并构建 sql 查询来执行此分页。在 GraphQL 中,我们按照相同的方法解决问题,例如使用以下查询:users(size:5 offset:2) {  id  name}这种方法看起来很容易实现,但是在深入挖掘之后,我们发现实现这一点的“最佳”模式是连接模式,查询将如下所示:users(first:2) {  totalCount  edges {    node {      name    }    cursor  }  pageInfo {    endCursor    hasNextPage  }}我们的数据保存在关系数据库中,因此我看不到游标如何提供帮助(除非我使用自动增量 ID?)。为什么这种复杂的方法比简单的方法更受推荐?还有什么 cursor 和 endCursor 将存储?我是否误解了我的学习路径中的某些内容?
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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

如果您发现实现Connection分页样式的价值,您有两个选择:

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 作为客户端。这是一个完全可选的东西,不应该被硬塞在它不属于的地方。


查看完整回答
反对 回复 2021-07-14
  • 1 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信