是否有一种很好的方法可以组合多个GraphQL对象的解析器,最好使用GraphQL js?

是否有一种很好的方法可以组合多个GraphQL对象的解析器,最好使用GraphQL js?,graphql,graphql-js,Graphql,Graphql Js,假设您有一个GraphQL层,它使用GraphQL js编写在node.js上,与SQL数据库通信。假设您有以下简单类型和字段: 商店 连锁杂货店的单一实体店。 字段: id:GraphQLID 地区:StoreRegion 员工:GraphQList(员工) StoreRegion 一种GraphQLEnumType,包含链将其存储区划分为的区域列表。 价值观: 东北 大西洋中部 东南 员工 表示在商店工作的单个员工。 字段: id:GraphQLID 名称:GraphQLStr

假设您有一个GraphQL层,它使用GraphQL js编写在node.js上,与SQL数据库通信。假设您有以下简单类型和字段:

  • 商店
    连锁杂货店的单一实体店。
    字段:

    • id:GraphQLID
    • 地区:StoreRegion
    • 员工:GraphQList(员工)
  • StoreRegion
    一种GraphQLEnumType,包含链将其存储区划分为的区域列表。
    价值观:

    • 东北
    • 大西洋中部
    • 东南
  • 员工
    表示在商店工作的单个员工。
    字段:

    • id:GraphQLID
    • 名称:GraphQLString
    • 薪金:GraphQLFloat
假设API公开了一个
store
查询,该查询接受一个区域并返回一个store对象列表。现在假设客户端发送此查询:

{
    store(region: NORTHEAST) {
        employees {
            name
            salary
        }
    }
}
希望到目前为止这一切都非常简单

这是我的问题,我希望(期待,真的)这是一个通用的解决方案,我现在很难找到它,因为我的Google Fu现在很弱:有没有一种好方法可以为这些类型编写解析程序,这样我就可以将所有返回存储区的所有员工的所有请求字段打包成一个SQL查询语句,导致一次到表单数据库的往返:

SELECT name,salary FROM employees WHERE id IN (1111, 1133, 2177, ...)
而不是每个员工提出一个请求,甚至每个商店提出一个请求

这实际上是一个更一般问题的具体实例:有没有一种好的方法来组合解析器,以避免在可以轻松组合的情况下发出多个请求


我是从graphql js的角度提出这个问题的,因为这正是我希望解决的问题,因为我认为这样可以得到更具体的答案,但如果有一个更不依赖于实现的答案,那也会很酷。

因此,基本上,您想知道如何将多个解析器组合到更少的数据库查询中。这是为了解决他们所谓的问题。这里至少有两种方法可以解决这个问题

  • :这是一个更通用的解决方案,由Facebook创建。您可以使用它将查询单个类型的单个项的多个查询批处理为查询单个类型的多个项的单个查询。在您的示例中,您可以将所有员工批处理到单个DB查询中,并且仍然可以使用单独的查询来获取存储。这里有一个

  • :专门针对SQL。将执行联接以对每个graphql查询执行一个SQL查询。这里有一个


  • 虽然这是绝对可能的,但本质上是针对API的一个特定查询进行优化。除非您已经确定一旦部署就会遇到性能问题,否则使用简单的解析器和优化问题查询(一旦它们成为问题)可能是最实际的做法:-)否则您可能会遇到许多一次性优化,从而使更改更加困难。