java - GraphQL 分页 : cursor vs offset

标签 java groovy graphql graphql-java

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

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

在 GraphQL 中,我们按照相同的方法解决问题,例如使用以下查询:

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

这种方法看起来很容易实现,但是在深入挖掘之后,我们发现实现这一点的“最佳”模式是连接模式,查询将如下所示:
users(first:2) {
  totalCount
  edges {
    node {
      name
    }
    cursor
  }
  pageInfo {
    endCursor
    hasNextPage
  }
}

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

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

最佳答案

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

如果您看到实现 Connection 的值(value)分页样式,您有 2 个选择:

1) 治疗 after作为偏移量(意味着将传递一个数字),和 first作为限制:

SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first
before 也一样和 last ,只是方向不同。

2)另一种方式是治疗after/before作为排序列的最后看到的值(因此将传递实际(混淆)值):
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first

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

关于java - GraphQL 分页 : cursor vs offset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795299/

相关文章:

java - 获取值并将文本打印到文本字段

grails - 我可以仅提供一种服务来呈现.gsp和.gson View 吗?普通/粗俗

java - 当我尝试查看Grails 2.4.5的版本并创建应用程序时,为什么它不起作用?

api - GraphQL 对于没有前端客户端的系统有用吗?

java - 无法在 Spring boot 2 中上传 1gb 文件

java - Swing 应用程序中的 Swing 弹出窗口

java - 在 Java/Groovy 中验证文件/获取真实文件类型?

python - 如何使用 Graphene GraphQL 解析嵌套在另一种类型中的字段?

graphql - 如何在 Hasura GraphQL 中更新插入嵌套表值?

java - 如何在不创建 AWS 资源的情况下验证 Java 8 中的 AWS cron 表达式?