我目前正在开发一个使用 Apollo Server/PostgresQL 和 Knex/Objection 的 GraphQL 项目。
我正在使用的数据集可以很容易地增加到 10 万个项目。
所以关于分页的问题出现了,我试图找到一种方法来处理基于游标的分页,因为这似乎是现在的标准。
但是在检查了几个实现之后,例如:
https://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm https://github.com/Terminal-Systems/apollo-cursor-pagination
我的感觉是,对于所有这些实现,在基于游标进行切片之前,会获取整个数据集。这让我感到困惑,因为当您处理更大的数据集时,这似乎是一个巨大的性能问题?
即使在我链接的 Relay 规范中,它也声明您在根据前后参数切片之前从 allEdges
开始。
有什么我想念的吗?因为我看不出这是一种比基于偏移量的分页更好的方法,但我很乐意被证明是错误的,并指出我的推理在哪里。
干杯,周五快乐!
最佳答案
Relay 规范确实指定获取所有满足提供的 before
和 after
参数的边,然后根据 first
或最后一个
参数。在处理较大的表时,这样做确实会明显变慢并且会占用更多内存。
与基于偏移量的分页相比,使用基于游标的分页的主要好处是它可以更好地处理频繁添加或删除行的表。分页时可能会添加或删除边缘——这可能导致在使用基于偏移量的分页时跳过边缘或获得重复边缘。
基于游标的分页可以以不需要获取所有行的方式实现。有像 this one 这样的图书馆那样做。我不能说这样做是否会在技术上使您的服务器“不符合规范”,但我想只要结果相同,您的服务器仍会与中继客户端兼容。也就是说,如果您不担心在前端支持 Relay 客户端,则没有必要实现 Relay 样式的连接或 Relay 规范的任何其他部分。您可以在符合中继的服务器之外进行基于光标的分页。
关于database - 当 Relay 游标分页总是获取整个数据集时,它如何处理大数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135229/