Optimization 如何不通过GraphQL公开重复的(规范化?)节点?
假设用户有很多链接(这意味着链接是由用户创建的),我想开发API来获取与用户一起的链接,以便返回的数据不包含重复的用户 换句话说,与此请求不同的是:Optimization 如何不通过GraphQL公开重复的(规范化?)节点?,optimization,graphql,normalization,Optimization,Graphql,Normalization,假设用户有很多链接(这意味着链接是由用户创建的),我想开发API来获取与用户一起的链接,以便返回的数据不包含重复的用户 换句话说,与此请求不同的是: query { links { id user { id email } } } 返回以下数据: { "data": { "links": [ { "id": 1, "user&
query {
links {
id
user {
id email
}
}
}
返回以下数据:
{
"data": {
"links": [
{
"id": 1,
"user": {
"id": 2,
"email": "user2@example.com"
}
},
{
"id": 2,
"user": {
"id": 2,
"email": "user2@example.com"
}
}
]
}
}
我想在参考资料栏中提出如下要求:
query {
links {
id
userId
}
references {
users {
id
email
}
}
}
返回不带重复项的关联用户:
{
"data": {
"links": [
{
"id": 1,
"userId": 2
},
{
"id": 2,
"userId": 2
},
],
"references": {
"users": [
{
"id": 2,
"email": "user2@example.com"
}
]
}
}
}
这将减少客户端和服务器之间传输的数据量,从而提高速度
这个想法的任何语言都有现成的通用实现吗?理想情况下,寻找Ruby并不是一个用来规范数据的查询或服务器角色。
GraphQL规范中没有这种可能性;
服务器必须返回查询的[response]结构中的所有询问字段;
。。。但您可以实现一些:
标准化常用分页中继样式的边缘/节点,仅节点或两者都更好;
查询[复杂性]权重,以促进这种优化的查询风格-分离问题;
查询类型中的引用字典字段;
其中:
用户有id和电子邮件道具;
referencedUsers是[User!]类型;
node.author为用户类型;
规范化Graphql客户端(如Apollo)可以轻松访问缓存的用户字段,而无需发出单独的请求
你能做出反应吗?组件中的某些组件将node.authorId作为参数传递,如。用户组件可以使用带有仅缓存策略的查询挂钩来读取用户道具/字段
详见阿波罗文档。您应该自己实现这一点,并将其记录下来,以帮助/指导API用户。谢谢!是的,我知道Apollo有一个缓存系统,如果数据已经被密钥Typeid获取,它就不会从后端查询数据。当然,这很好。但问题更多地涉及减少服务器和客户端之间的流量数据。以及如何实现这个棘手的解析器,允许在单独的结构中选择引用的实体。[可能]如果没有加权查询,您将无法减少流量。。。IDKRuby。。。一般来说,[graphql解析流]它可以像。。。links resolver从一个DB表读取记录,只需将用户ID收集到某个数组中,保存在边缘/节点和分页信息旁边的links result对象中,然后在referencedUsers resolver by parent中使用它,第一个参数用于从第二个DB表提取用户
links {
egdes {
node {
id
title
url
authorId
# possible but limited usage with heavy weights
# author {
# id
# email
# }
}
}
pageInfo {
hasNextPages
}
referencedUsers {
id
email
}
}