避免嵌套分页的模式设计

Schema design to avoid nested pagination

首先,我使用的是“中继”分页的简化版本,其中“列表”基本等同于“连接”,“限制”等同于“第一”,“游标”等同于到“之后”。

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

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 的下一个节点](例如,在查询 artist 上允许 photos 的参数 cursor 并在查询 artists 上禁止它)。但我看不到如何在 GraphQL 模式中表达它。

没有办法做你具体想做的事。您可以 return 来自 artist(例如 ArtistWithPagination)和 artists(例如 ArtistWithoutPagination)的不同类型。我不确定是否值得权衡两种非常相似的类型。

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