首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL和嵌套资源会进行不必要的调用吗?

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

Stack Overflow用户
提问于 2017-03-17 11:08:20
回答 2查看 1.1K关注 0票数 5

我读过GraphQL规范,却找不到避免1+N* number_of_nested调用的方法,是不是遗漏了什么?

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

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

我之所以这样问是因为我想将GraphQL与一个能够高效地获取嵌套资源的API集成起来,如果在解析之前有一种解决整个图的方法,那么最好尝试在一个调用中添加一些嵌套的内容。

或者我搞错了,GraphQL只适用于微服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-18 23:25:25

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

如果您在服务器上使用Node.js,我建议您使用两个工具:

  • DataLoader -一个与数据库无关的工具,用于为每个字段批处理解析器和缓存各个记录。
  • 加入怪物 -一个SQL定制工具,它读取每个查询和您的模式,并为您编译一个SQL查询。它利用联接和DataLoader风格的批处理,在几个SQL查询(或单个SQL查询)中从表中获取数据。
票数 2
EN

Stack Overflow用户

发布于 2017-03-17 13:28:36

我认为,您所讨论的是在SQL数据库后端中使用GraphQL。该标准本身与数据库无关,它并不关心,您将如何解决代码中可能出现的N+1选择问题。尽管如此,GraphQL服务器的特定服务器端实现引入了许多不同的方法来缓解这个问题:

  • Ruby实现能够利用活动记录和宝石(如项目符号 )应用执行的数据库调用的水平批处理。
  • JavaScript实现可以利用DataLoader库,该库具有类似于批处理一系列执行承诺的技术。您可以在行动这里中看到它。
  • 灵丹妙药和Python实现有关于已执行子查询的运行时信息的概念,这些信息可用于确定执行GraphQL查询所需的数据,并可能预取数据。
  • F#实现与Elixir类似,但是插件本身可以对执行树执行情况进行实时分析,以便更好地描述代码中可能使用的字段,从而使GraphQL域模型更容易从数据库模型中分离出来。
  • 许多实现(即PostGraph)将底层数据库模型直接绑定到GraphQL模式中。在这种情况下,GQL查询经常被直接转换成数据库查询语言。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42855932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档