entity/collection 模式命名的最佳实践

Best practice for schema naming of entity/collection

我正在构建一个 Graphql Schema,我在想什么是 returning 单个类型与集合类型的最佳实践。假设我们要检索 users

一个选项(如果可能的话)是有一个这样的查询,其中 ID 是可选的,如果 ID 被传递,我们 return 一个单一的项目,如果没有所有用户的集合

query {
  user (id: 1234) {
    name
  }
}

// return a single [User]
query {
  user (id: null) {
    name
  }
}

// return a collection [User,User,User,...]

另一种选择是 userusers

query {
  user (id: 1234) {
    name
  }
}

// return a single User
query {
  users {
    name
  }
}

// return a collection [User,User,User,...]

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

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

所以对于return单个用户来说,是:

type Query {
   user(id:Int!) : User
}

它总是 return 一个用户。只需将 id 输入参数设置为必需参数,这样它就不能接受 NULL.

和return一个用户列表,通常是:

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
}

根据需要,您可以考虑在users查询字段中添加一个orderBy或一个filter输入参数,为开发者获取结果提供更多选择设置他们感兴趣。

如果你想return光标分页风格的用户列表,你可以看看Relay Specification