Optimization 如何不通过GraphQL公开重复的(规范化?)节点?

Optimization 如何不通过GraphQL公开重复的(规范化?)节点?,optimization,graphql,normalization,Optimization,Graphql,Normalization,假设用户有很多链接(这意味着链接是由用户创建的),我想开发API来获取与用户一起的链接,以便返回的数据不包含重复的用户 换句话说,与此请求不同的是: query { links { id user { id email } } } 返回以下数据: { "data": { "links": [ { "id": 1, "user&

假设用户有很多链接(这意味着链接是由用户创建的),我想开发API来获取与用户一起的链接,以便返回的数据不包含重复的用户

换句话说,与此请求不同的是:

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
        }
      }