我很难找到有关GraphQL客户端如何或什至不知道的详细信息-这是(我认为?)最受欢迎的Apollo解决实体关系的方法。
因此GraphQL不支持设计中的无限嵌套 ,因为它可能导致灾难,处理未知深度树结构的推荐方法是延迟获取(更多请求),或者获取所有内容对象作为列表,然后使用关系在客户端上进行结构化。
这使我对如何解决图关系提出了一些显而易见的问题(但是其他许多问题也会导致这种关系)。
GraphQL规范或本例中的Apollo实现如何处理此类请求:
{
entities {
name
parent {
name
}
children {
name
children {
name
}
}
}
}
当服务器保存自引用树状数据时,例如:
| entity | name | parent |
|---------|------|---------|
| EntityA | A | null |
| EntityB | B | EntityA |
| EntityC | C | EntityA |
| EntityD | D | EntityB |
请注意,children
是基于数据库parent
(ManyToOne和OneToMany双向JPA实体)加载的。
entities
将返回所有四个实体及其name
,以及parent
和children
。
但是随后在parent
/ children
字段中也包含对其他人的引用,并且将重复该操作。
我知道服务器的实际响应将始终完全由您在查询中要求的内容组成,因此我们最终会遇到很多重复的类型,但是GraphQL规范是否定义了分辨率,并且在这种情况下,Apollo会处理这种关系对我们来说,例如将所有具有相同ID的请求实体连接为一种类型?通过串联,我的意思是,如果我要向子实体添加额外的detail
字段并从父实体中请求它,而不是从entities
查询中请求-我是否将孩子与detail
结合起来,是否有相同的实体(但来自entities
查询)?
类似的东西:
{
entities {
name
parent {
name
}
children {
name
detail // Will it concat with the same entity that is in above level?
children {
name
}
}
}
}
一般而言-在Apollo中是否有关于如何以及是否将具有相同标识符的实体作为客户端对象的规范?他们会复制吗?