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

GraphQL和嵌套资源会进行不必要的调用吗?,graphql,Graphql,我阅读了GraphQL规范,但找不到避免1+N*个嵌套调用的方法,我是否遗漏了什么 i、 e.一个查询有一个具有嵌套订单和地址的客户机类型,如果有10个客户机,它将为10个客户机执行1次调用+为每个客户机执行10次调用。订单+为每个客户机执行10次调用。地址 有没有办法避免这种情况?并不是说它和缓存某个东西的UUID不一样,这些都是不同的值,如果您将GraphQL指向一个可以进行连接的数据库,那么它将非常糟糕,因为您可以对任意数量的客户端执行3次查询 我问这个问题是因为我想将GraphQL与一个

我阅读了GraphQL规范,但找不到避免1+N*个嵌套调用的方法,我是否遗漏了什么

i、 e.一个查询有一个具有嵌套订单和地址的客户机类型,如果有10个客户机,它将为10个客户机执行1次调用+为每个客户机执行10次调用。订单+为每个客户机执行10次调用。地址

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

我问这个问题是因为我想将GraphQL与一个API集成,该API可以高效地获取嵌套资源,如果有一种方法可以在解析之前解析整个图形,那么最好尝试在一个调用中放入一些嵌套的内容


还是我搞错了,GraphQL只能用于微服务?

< P>我想,你是在谈论用SQL数据库后端使用GealQL。该标准本身与数据库无关,它不关心如何解决代码中可能存在的N+1选择问题。话虽如此,GraphQL server的特定服务器端实现引入了许多不同的方法来缓解该问题:

另外,Ruby实现能够利用ActiveRecord和gems,例如对执行的数据库调用应用水平批处理。 JavaScript实现可以使用库,库具有将一系列已执行承诺批处理在一起的类似技术。你可以在行动中看到它。 Elixir和Python实现具有关于已执行子查询的运行时信息的概念,可用于确定执行GraphQL查询需要哪些数据,并可能对其进行预取。 F实现的工作原理类似于Elixir,但插件本身可以对执行树进行实时分析,以更好地描述代码中可能使用的字段,从而更容易地将GraphQL域模型与数据库模型分离。 许多实现(如PostGraph)将底层数据库模型直接绑定到GraphQL模式中。在这种情况下,GQL查询通常直接翻译成数据库查询语言。
这是GraphQL解析器体系结构的难点之一。您必须通过在每个解析器中执行大量I/O来避免产生大量网络延迟。使用SQL DBMS的应用程序一开始通常会遇到N+1问题。您需要使用一些批处理和/或缓存技术来解决这个问题

如果您在服务器上使用Node.js,我推荐两种工具:

-一个数据库无关工具,用于为每个字段批处理解析器并缓存单个记录

-一个SQL定制工具,用于读取每个查询和架构,并为您编译SQL查询。它利用联接和DataLoader样式的批处理,在几个或单个SQL查询中从表中获取数据


这不仅对SQL后端有用,如果您有一个API可以在一个请求中获取数据,那么执行多个请求就有点不好了。正如我看到的,javascript和python实现都有一个缓存,它只能解决已经看到的对象,比如user->friends,其中friends也是用户实例,如果你经常嵌套,它肯定会解决这个问题。谢谢,Andy!也许我不会使用node,可能是python或rust,但我知道从GraphQL的体系结构可以做到这一点,我将从那里开始,并尝试构建一个解决方案。