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

Does GraphQL ever redundantly visit fields during execution?

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

{
  getAuthor(id: 5){
    name
    posts {
      title
      author {
        name # this will be the same as the name above
      }
    }
  }
}

它被解析并变成了如下所示的 AST:

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

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

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

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

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

另一种(虽然更复杂)方法是根据在根级别执行的请求字段组成单个数据库查询。例如,我们的 getAuthor 解析器可以构造一个查询,该查询将 return 作者、他们的 post 和每个 post 的作者。使用这种方法,我们可以跳过为 Author 类型的 posts 字段或 Post 类型的 author 字段编写解析器,而只使用默认的解析器行为。但是,为了做到这一点并避免过度获取,我们必须在 getAuthor 解析器中解析 GraphQL 请求,以确定请求了哪些字段,因此应将其包含在我们的数据库查询中。