sau*_*uce 6 node.js apollo graphql 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]
}
Run Code Online (Sandbox Code Playgroud)
然后我有Boards - > Lists - > Cards - > Comments
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
}
Run Code Online (Sandbox Code Playgroud)
哪个效果很好.但我很好奇嵌套我是如何真正制作我的架构的.如果我添加其余部分以使图表完整:
type Team {
id: ID!
inviteToken: String!
owner: String!
name: String!
archived: Boolean!
members: [String]
**boards: [Board]**
}
Run Code Online (Sandbox Code Playgroud)
这将实现更深入的图表.但是我担心会有多么复杂的突变.特别是对于电路板架构向下,我需要发布所有操作的订阅更新.如果我添加评论,发布整个电路板更新是非常低效的.虽然为每个嵌套模式的每个创建/更新构建了一个订阅逻辑,但似乎需要很多代码才能实现简单的操作.
对象图中正确深度的想法?请记住,用户旁边的每个对象都需要向多个用户广播.
谢谢
GraphQL 的目的是避免多次查询,因此我确信制作嵌套结构是正确的方法。考虑到安全性,添加一些 GraphQL 深度限制库。
GraphQL风格指南建议您将所有复杂结构放在单独的对象类型中(如评论、团队、董事会......)。然后进行复杂的查询/突变取决于您。
我想让你扩展这句话
如果我添加评论,发布整个董事会更新,效率极低
我不确定这一点,因为你有你的卡 ID。因此添加新评论将触发突变,这将创建新的评论记录并使用新评论更新卡片。
因此,后端的数据结构将定义您获取它的方式,但不会定义您改变它的方式。
除了了解设计突变的方法的一般知识之外,我还建议阅读这篇文章。
| 归档时间: |
|
| 查看次数: |
571 次 |
| 最近记录: |