我的Express后端中有一个GraphQL API。类型的一个属性是计数。例如
type Baz {
id: ID
name: String!
bars: [Bar]
}
type Bar {
id: ID
name: String!
foo: Foo!
}
type Foo {
id: ID
name: String!
barCount: Int
}
这同样反映在数据库中(ORM是Sequelize,数据库是Postgresql)。如果我现在触发此GraphQL查询:
{
Baz(id: 1){
...
bars {
...
foo {
...
barCount
}
}
}
}
将导致多个barCounts,这在Postgresql中非常昂贵(尤其是当Bar有> 20.000.000行时),并且最终像这样在Bar上计数10次:
Select count(*) AS count
FROM Bar
WHERE foo = 1;
我试图从常规查询中删除barCount并进行额外的查询以进行计数,然后将所有内容批处理至:
SELECT count(*) as count, foo
FROM Bar
WHERE foo IN (1,2,3)
GROUP BY foo;
但是,如果这样做,我将把barCount集成到React Apollo客户端的数据对象中会遇到问题。
还是我应该使用Dataloader之类的东西以某种方式批处理所有不同的foo.barCounts?