GraphQL:如何嵌套以制作架构?

时间:2018-12-27 21:07:22

标签: node.js graphql apollo graphql-subscriptions

去年,我将应用程序转换为使用Graphql。到目前为止,一切都很好,在转换期间,我基本上将支持REST端点的所有服务都移植到了grapqhl查询和变异中。该应用程序运行良好,但希望继续发展我的对象图。

让我们认为我有以下关系。

用户->团队->董事会->列表->卡->评论

我目前有两种不同的嵌套模式:用户->团队:

    type User {
  id: ID!
  email: String!
  role: String!
  name: String!
  resetPasswordToken: String
  team: Team!
  lastActiveAt: Date
}

type Team {
  id: ID!
  inviteToken: String!
  owner: String!
  name: String!
  archived: Boolean!
  members: [String]
}

然后我有木板->列表->卡片->评论

type Board {
  id: ID!
  name: String!
  teamId: String!
  lists: [List]
  createdAt: Date
  updatedAt: Date
}

type List {
  id: ID!
  name: String!
  order: Int!
  description: String
  backgroundColor: String
  cardColor: String
  archived: Boolean
  boardId: String!
  ownerId: String!
  teamId: String!
  cards: [Card]
}

type Card {
  id: ID!
  text: String!
  order: Int
  groupCards: [Card]
  type: String
  backgroundColor: String
  votes: [String]
  boardId: String
  listId: String
  ownerId: String
  teamId: String!
  comments: [Comment]
  createdAt: Date
  updatedAt: Date
}

type Comment {
  id: ID!
  text: String!
  archived: Boolean
  boardId: String!
  ownerId: String
  teamId: String!
  cardId: String!
  createdAt: Date
  updatedAt: Date
}

哪个效果很好。但是我很好奇我如何嵌套才能真正创建自己的架构。如果我添加其余部分以使图完整:

type Team {
      id: ID!
      inviteToken: String!
      owner: String!
      name: String!
      archived: Boolean!
      members: [String]
      **boards: [Board]**
    }

这将获得更深的图表。但是我担心会有多少复杂的突变。特别是对于向下的板模式,我需要发布所有操作的订阅更新。如果我添加评论,那么发布整个电路板更新的效率非常低。在为每个嵌套模式的每次创建/更新构建订阅逻辑时,似乎需要大量代码来实现一些简单操作。

关于对象图中正确深度的任何想法?请记住,用户旁边的每个对象都需要广播给多个用户。

谢谢

2 个答案:

答案 0 :(得分:3)

GraphQL的目的是避免几个查询,因此,我确信使嵌套结构正确。考虑到安全性,添加一些GraphQL深度限制库。

GraphQL style guides建议您在单独的对象类型中拥有所有复杂的结构(如您所具有的Comment,Team,Board ...)。 然后,您可以进行复杂的查询/变异。

我希望您扩大这句话

  

如果我添加评论,请发布整个版面更新   效率低下

由于您具有银行卡的ID,因此我不确定。因此,添加新评论会触发突变,从而创建新的评论记录并使用新评论更新Card。

因此,后端的数据结构将定义获取数据的方式,而不是对数据进行变异的方式。

例如,以GitHub GraphQL API为例:

  • 每个变异都是一个用于更新/创建复杂树的小功能,即使它们的后端类型为nested structure

除了对设计突变的方法有一般认识外,我建议使用此article

答案 1 :(得分:1)

您可以在GraphQL中使用嵌套,例如

type NestedObject {
  title: String
  content: String
}

type MainObject {
  id: ID!
  myObject: [NestedObject]
}

在上面的代码中,NestObject的类型定义被注入到myObject数组中。为了更好地理解,您可以将其视为:

type MainObject {
  id: ID!
  myobject: [
    {
      title: String
      content: String
    }
  ]
}

我希望这可以解决您的问题!