Graphql 实体/集合的架构命名最佳实践

Graphql 实体/集合的架构命名最佳实践,graphql,apollo-client,Graphql,Apollo Client,我正在构建一个Graphql模式,我想知道返回类型的单个项和集合项的最佳实践是什么。假设我们要检索用户 一个选项(如果可能的话)是有这样一个查询,ID是可选的,如果传递了ID,我们将返回单个项目,如果不是所有用户的集合 查询{ 用户(id:1234){ 名称 } } //返回单个[用户] 查询{ 用户(id:null){ 名称 } } //返回集合[用户,用户,用户,…] 另一种选择是让用户和用户 查询{ 用户(id:1234){ 名称 } } //返回单个用户 查询{ 使用者{ 名称 }

我正在构建一个Graphql模式,我想知道返回类型的单个项和集合项的最佳实践是什么。假设我们要检索
用户

一个选项(如果可能的话)是有这样一个查询,
ID
是可选的,如果传递了
ID
,我们将返回单个项目,如果不是所有用户的集合

查询{
用户(id:1234){
名称
}
}
//返回单个[用户]
查询{
用户(id:null){
名称
}
}
//返回集合[用户,用户,用户,…]
另一种选择是让
用户
用户

查询{
用户(id:1234){
名称
}
}
//返回单个用户
查询{
使用者{
名称
}
}
//返回集合[用户,用户,用户,…]

我想知道什么是最佳实践,或者您是否可以为我指出一些与此相关的资源以供阅读。

我使用单数和复数名词来命名分别返回单个对象和对象列表的查询字段。我认为这种命名风格对大多数开发人员来说是非常自然的

因此,要返回单个用户,它是:

type Query {
   user(id:Int!) : User
}
它总是返回一个用户。只需将
id
输入参数设置为强制参数,这样它就不能接受
NULL

要返回用户列表,通常是:

type Query {
   users : [User]
}
<>但是,如果它可以有很多用户,很可能需要考虑一些分页之类的东西,允许开发人员逐页访问用户。对于基于偏移量的分页,我将执行如下操作:

type Query {
   users(offset:Int limit:Int) : UserPage
}

type UserPage {
   data     : [User]
   pageInfo : PageInfo
}

type PageInfo {

    # When paginating forwards, are there more items?
    hasNextPage    : Boolean!

    # When paginating backwards, are there more items?
    hasPreviousPage: Boolean!

    # Total number of records in all page
    total : Long
}

根据需求,可以考虑添加<代码> OrthBue<代码>或<代码>过滤器>代码>输入参数到<代码>用户< /代码>查询字段,为开发人员提供更多选项,使结果集对他们感兴趣。 如果要以基于光标的分页样式返回用户列表,可以查看