去年,我将应用程序转换为使用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]**
}
这将获得更深的图表。但是我担心会有多少复杂的突变。特别是对于向下的板模式,我需要发布所有操作的订阅更新。如果我添加评论,那么发布整个电路板更新的效率非常低。在为每个嵌套模式的每次创建/更新构建订阅逻辑时,似乎需要大量代码来实现一些简单操作。
关于对象图中正确深度的任何想法?请记住,用户旁边的每个对象都需要广播给多个用户。
谢谢
答案 0 :(得分:3)
GraphQL的目的是避免几个查询,因此,我确信使嵌套结构正确。考虑到安全性,添加一些GraphQL深度限制库。
GraphQL style guides建议您在单独的对象类型中拥有所有复杂的结构(如您所具有的Comment,Team,Board ...)。 然后,您可以进行复杂的查询/变异。
我希望您扩大这句话
如果我添加评论,请发布整个版面更新 效率低下
由于您具有银行卡的ID,因此我不确定。因此,添加新评论会触发突变,从而创建新的评论记录并使用新评论更新Card。
因此,后端的数据结构将定义获取数据的方式,而不是对数据进行变异的方式。
例如,以GitHub GraphQL API为例:
除了对设计突变的方法有一般认识外,我建议使用此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
}
]
}
我希望这可以解决您的问题!