【发布时间】:2021-12-09 21:01:18
【问题描述】:
我刚开始使用graphql,所以这可能是一个愚蠢的问题,但我有以下情况:我有一个对象,我们称之为汽车,它具有各种属性,其中包括驱动程序日志或其他任何东西。当我查询特定汽车并且我也想要日志时,解析器运行并使用父 ID 从数据库返回日志条目。但是当我查询多辆汽车时,日志条目的解析器将为返回的每辆汽车运行。
在 graphql 之外,我会一次获取所有必需的日志条目并将它们分配给每辆汽车,因此我只需要查询数据库一次。
有什么方法可以在 graphql 中实现这一点吗?我认为运行一个查询并过滤结果比为每个查询对象运行一个查询更有效。还是我想多了,我应该只查询数据库的每条记录?我想,我需要知道的是:有没有办法从父解析器知道我是否需要在子解析器中解析数据,以及我是否可以在父解析器中获取这些数据并将其传递给子解析器。
【问题讨论】:
-
过度获取很糟糕,因为它需要更多资源(内存),所以效率并不高......您可以在需要(查询)时在父级中获取子数据,但并非总是如此
-
我知道过度获取是不好的,但在这种情况下我不会过度获取。我会通过检查日志字段是否被查询来检查我是否需要日志数据。如果不需要,我不会获取数据。
-
这听起来像是一个 N+1 问题,使用数据加载器将有助于您的方案
-
抱歉,忘记将此标记为已回答。我是 graphql 的新手,直到我在这里遇到它才知道 n+1 的东西。我最终实现了一些前瞻和条件预取。下一站将是添加数据加载器。感谢您的回复。
标签: graphql graphql-js express-graphql