如何在GraphQL中处理昂贵的属性

时间:2018-06-22 19:56:38

标签: postgresql graphql apollo react-apollo

我的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?

0 个答案:

没有答案