【发布时间】:2018-07-28 20:09:48
【问题描述】:
Dataloader 能够批处理和缓存请求,但它只能通过调用 load(key) 或 loadMany(keys) 来使用。
我遇到的问题是,有时我不知道我要提前加载的项目的键。
我正在使用 sql 数据库,当当前对象具有来自与另一个模型的 belongsTo 关系的外键时,这可以正常工作。
例如,某个用户属于某个组,因此有一个 groupId。要解析组,您只需调用 groupLoader.load(groupId)。
另一方面,如果我想解析一个组中的用户,其中可能有很多,我想要一个查询,例如
SELECT * from users where user.groupId = theParticularGroupId
但是这样的查询不使用用户的密钥,所以我不确定如何使用数据加载器。
我可以做另一个请求来获取密钥,例如
SELECT id from users where user.groupId = theParticularGroupId
然后使用这些键调用 loadMany...但我可以直接请求数据。
我注意到 dataloader 有一个 prime(key, value) 函数可以用来初始化缓存,但是只有在数据已经获取后才能完成。此时可能已经发送了许多查询,并且可能已获取重复数据。
另一个例子是下面的查询
query {
groups(limit: 10) {
id
...
users {
id
name
...
}
}
}
如果我正在搜索前 10 个组或最后 10 个组,我无法知道密钥。然后一旦我有了这 10 个组。我不知道他们用户的密钥,以及每个解析器是否会使用诸如
之类的查询来解析用户SELECT * from users where user.groupId = theParticularGroupId
该查询将被执行 10 次。加载数据后,我现在可以启动缓存,但已经发出了 10 个请求。
有没有办法解决这个问题?也许不同的模式或数据库结构或者数据加载器甚至都不是正确的解决方案。
【问题讨论】:
标签: javascript node.js caching graphql batching