我的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 Client中的数据对象中的问题 .

或者我应该使用像Dataloader这样的东西来批处理所有不同的foo.barCounts?