GraphQL是否在执行期间冗余访问字段?

GraphQL是否在执行期间冗余访问字段?,graphql,graphql-js,Graphql,Graphql Js,我正在阅读这篇文章,它使用了以下查询: { getAuthor(id: 5){ name posts { title author { name # this will be the same as the name above } } } } 它被解析并转换为AST,如下所示: 很明显,它带来了冗余信息(两次询问作者的名字),所以我想知道GraphQL是如何处理的。它是否冗余地获取这些信息?图表是否正确描述

我正在阅读这篇文章,它使用了以下查询:

{
  getAuthor(id: 5){
    name
    posts {
      title
      author {
        name # this will be the same as the name above
      }
    }
  }
}
它被解析并转换为AST,如下所示:

很明显,它带来了冗余信息(两次询问作者的名字),所以我想知道GraphQL是如何处理的。它是否冗余地获取这些信息?图表是否正确描述了实际AST

如能深入了解与此相关的查询解析和执行过程,将不胜感激,谢谢


编辑:我知道这可能因GraphQl服务器的实际实现而异,但我想知道标准/最佳实践是什么

是的,在此场景中,GraphQL可能多次获取相同的信息。GraphQL不会记忆解析器函数,因此即使使用相同的参数和相同的父值调用它,它仍将再次运行

在GraphQL中使用数据库时,这是一个相当常见的问题。最常见的解决方案是利用,它不仅批量处理数据库请求,而且在GraphQL请求期间为这些请求提供缓存。这样,即使某个特定记录被多次请求,也只会从数据库中获取一次


另一种方法(尽管更复杂)是基于在根级别执行的请求字段组合单个数据库查询。例如,我们的
getAuthor
解析程序可以构造一个查询,返回作者、他们的帖子以及每个帖子的作者。使用这种方法,我们可以跳过为
Author
类型上的
posts
字段或
Post
类型上的
Author
字段编写解析器,而只使用默认解析器行为。但是,为了做到这一点并避免过度抓取,我们必须在
getAuthor
解析器中解析GraphQL请求,以确定哪些字段被请求,因此应该包含在我们的数据库查询中。

感谢您的回复。当您说“基于在根级别执行的请求字段编写单个数据库查询”时,我假设您的意思是我们必须解析查询并以不同的方式构造AST,以避免冗余节点?有GraphQL客户机这样做吗?对不起,这不是我的意思。我本可以说得更清楚。您不会避免冗余节点,您只需要利用一个数据库查询来捕获所有相关节点。我编辑了我的答案来详细说明。谢谢你的澄清!