我应该或可以为父级中的子解析器获取数据吗?
Posted
技术标签:
【中文标题】我应该或可以为父级中的子解析器获取数据吗?【英文标题】:Should or can I fetch data for a child resolver in the parent? 【发布时间】:2021-12-09 21:01:18 【问题描述】:我刚开始使用graphql,所以这可能是一个愚蠢的问题,但我有以下情况:我有一个对象,我们称之为汽车,它具有各种属性,其中包括驱动程序日志或其他任何东西。当我查询特定汽车并且我也想要日志时,解析器运行并使用父 ID 从数据库返回日志条目。但是当我查询多辆汽车时,日志条目的解析器将为返回的每辆汽车运行。
在 graphql 之外,我会一次获取所有必需的日志条目并将它们分配给每辆汽车,因此我只需要查询数据库一次。
有什么方法可以在 graphql 中实现这一点吗?我认为运行一个查询并过滤结果比为每个查询对象运行一个查询更有效。还是我想多了,我应该只查询数据库的每条记录?我想,我需要知道的是:有没有办法从父解析器知道我是否需要在子解析器中解析数据,以及我是否可以在父解析器中获取这些数据并将其传递给子解析器。
【问题讨论】:
过度获取很糟糕,因为它需要更多资源(内存),所以效率并不高......您可以在需要(查询)时在父级中获取子数据,但并非总是如此 我知道过度获取是不好的,但在这种情况下我不会过度获取。我会通过检查日志字段是否被查询来检查我是否需要日志数据。如果不需要,我不会获取数据。 这听起来像是一个 N+1 问题,使用数据加载器将有助于您的方案 抱歉,忘记将此标记为已回答。我是 graphql 的新手,直到我在这里遇到它才知道 n+1 的东西。我最终实现了一些前瞻和条件预取。下一站将是添加数据加载器。感谢您的回复。 【参考方案1】:我已经找到了我应该一直在寻找的东西:前瞻数据获取和预取。您可以从第四个解析参数中获取字段。从那里您可以确定是否查询了可以预取的任何字段。
不确定性能,但我认为最好一次预取所有需要的行,而不是为结果中的每个对象运行大量查询。
无论如何,是的,可以进行预取,但不确定性能,但我现在至少可以运行一些基准测试,看看它的性能如何。
编辑:最终使用数据加载器。没有意识到它会自动批处理您的请求,因此您实际上不需要任何逻辑来预取或预读。
【讨论】:
github.com/graphql/dataloader以上是关于我应该或可以为父级中的子解析器获取数据吗?的主要内容,如果未能解决你的问题,请参考以下文章