我在服务器上使用Apollo GraphQL,并且正在尝试设计GraphQL API。我遇到的一个问题是,相对于根查询,我是否应该更喜欢嵌套查询。
在本示例中,我们同时检查了当前用户me
有很多invitations
的情况。
根本查询
me {
id
name
}
invitations {
id
message
}
invitations
的解析器返回当前用户的邀请。
嵌套查询
me {
id
name
invitations {
id
message
}
}
除了使用后一种方法将邀请嵌套在用户对象me
中之外,这些方法应该达到相同的结果。我担心的是,如果此方法与Apollo Client保持一致,可以使缓存保持一致。
设计GraphQL查询的推荐方法是什么?
答案 0 :(得分:2)
GraphQL卖点之一是允许客户具有很大的灵活性,以最小的请求数来定义他们要查询的数据的形状。他们还鼓励开发人员在设计架构时使用“ Think in Graphs”。
因此,我将进行嵌套查询,该查询看起来更像一个图形。此外,它更加灵活。如果用户希望通过邀请获取其用户个人资料数据,则只能在单个请求中获取它们。如果他们只想获取配置文件数据,则只需忽略查询中的邀请部分,由于GraphQL的设计性质,服务器不会浪费任何资源来获取邀请数据。
答案 1 :(得分:1)
我会说这确实取决于情况。就我个人而言,我将嵌套属性视为上下文:如果API使用者希望获取矿山通知,则它是me { notifications { ... } }
,而不是notifications { ... }
。例如,如果有一个顶级密钥是有意义的,那么就有一个 global 通知(不依赖于用户)的概念,然后继续使用。如果每个用户都有自己的通知(我认为是正确的),则类型me
的{{1}}应该具有通知,就像每个User
一样。这种概括鼓励了可重用的思想:使用User
代替user(id: ...) { ... }
的管理面板可以免费使用相同的UI代码 。
根据经验,最好考虑使用该API,而不提供它。