GraphQL 和嵌套资源会进行不必要的调用吗?

Jay*_*eis 5 graphql

我阅读了 GraphQL 规范,但找不到避免 1 + N * number_of_nested 调用的方法,我错过了什么吗?

即查询有一个类型的客户端,它具有嵌套的订单和地址,如果有 10 个客户端,它将为 10 个客户端执行 1 次调用 + 每个 client.orders 的 10 个调用 + 每个 client.addresses 的 10 个调用。

有没有办法避免这种情况?并不是说它与缓存某个东西的 UUID 不同,这些都是不同的值,如果你 GraphQL 指向一个可以进行连接的数据库,那将是非常糟糕的,因为你可以对任意数量的客户端进行 3 次查询.

我问这个是因为我想将 GraphQL 与一个 API 集成,该 API 可以以一种有效的方式获取嵌套资源,如果有一种方法可以在解决之前解决整个图,那么尝试将一些嵌套的东西放在一次调用中会很好。

或者我弄错了,GraphQL 只能用于微服务?

And*_*son 2

这是 GraphQL 的“解析器架构”的难点之一。您必须通过在每个解析器中执行大量 I/O 来避免产生大量网络延迟。使用 SQL DBMS 的应用程序通常首先会解决 N+1 问题。您需要使用一些批处理和/或缓存技术来解决这个问题。

如果你在服务器上使用 Node.js,我有两个工具可以推荐:

  • DataLoader - 一种与数据库无关的工具,用于对每个字段的批处理解析器并缓存单个记录。

  • Join Monster - 一款 SQL 定制工具,可以读取每个查询和您的架构并为您编译 SQL 查询。它利用 JOIN 和 DataLoader 式批处理通过几个(或单个)SQL 查询从表中获取数据。