避免嵌套分页的模式设计

Posted

技术标签:

【中文标题】避免嵌套分页的模式设计【英文标题】:Schema design to avoid nested pagination 【发布时间】:2020-10-15 22:28:31 【问题描述】:

首先,我使用的是“Relay”分页的简化版本,其中“List”是“connection”的基本等价物,“limit”等价于“first”,“cursor”等价于“之后”。

这是我的架构的相关部分:

extend type Query 
    artist(id: ID!): Artist
    artists(limit: Int!, cursor: String): ArtistList!


type Artist 
    id: ID!
    account: Account!
    photos(limit: Int!, cursor: String): PhotoList!
    website: String
    instagram: String
    facebook: String
    created: Date!
    updated: Date
    about: String


type ArtistList 
    nodes: [Artist]!
    page: Page!

我想避免嵌套分页,所以希望在查询 artist 上允许获取 photos 的下一个节点,并且不允许在查询 artists 上获取 photos 的下一个节点(例如,允许参数 @987654326 @ of photos 查询 artist 并禁止查询 artists)。但我看不出如何在 GraphQL 模式中表达这一点。

【问题讨论】:

【参考方案1】:

没有办法专门做你想做的事。您可以从artist(例如ArtistWithPagination)和artists(例如ArtistWithoutPagination)返回不同的类型。我不确定这是否值得用两种非常相似的类型进行权衡。

或者,当用户尝试以这种不受欢迎的方式(使用custom validation rule)查询 API 时,您可能会引发运行时错误。如果您的 GraphQL API 是内部的,您甚至可以开发一个 linter,它会在开发人员在查询中进行双重分页时发出警告。

【讨论】:

我认为这是不可能的,但我对 GraphQL 的经验很少,想确定一下。我将阅读有关validation 的文档。我正在考虑的另一种可能性是重新设计 API,永远不允许通过类型 artist 进行分页并获得相同的结果,对一个请求执行两个查询(我不确定这是否是正确的方法GraphQL 的视图,否则可能会出现问题)。 是的,您可以考虑单独查询photosByArtistId(id: ID!) 来获取照片。但是我不确定您是否真的在这里解决了问题(或者这是否是某种过早的优化/工程自行车脱落)。我真的无法想象用户会如何尝试分页两次。 你是对的,它是一个用于小应用程序的私有 API。我需要避免过早的和可能不必要的优化。

以上是关于避免嵌套分页的模式设计的主要内容,如果未能解决你的问题,请参考以下文章

将参数从带有分页的元素列表传递给引导模式

涉及到分页的table的请求模式

第14章WEB14-JDBC案例篇

带有分页的可扩展嵌套 Angular 材料数据表未按预期工作?

linux分页机制

(C#)winform界面超过屏幕范围的数量,则使用上一页、下一页的分页模式怎样实现?