【问题标题】:GraphQL - Difference between using alias versus multiple query objects when doing batch queriesGraphQL - 进行批量查询时使用别名与多个查询对象之间的区别
【发布时间】:2020-10-06 19:41:43
【问题描述】:

我对 GraphQL 还很陌生,所以如果我在需要的地方错了,请纠正我。我想知道在单个请求中执行批处理查询的最佳方式或最合适的方式是什么。我见过这样做的例子:

[
  {
    query: "query(param1)"
  },
  {
    query: "query(param2)"
  }
]

或者使用别名来完成同样事情的例子:

query {
  alias1: resolver1(param1)
  alias2: resolver2(param2)
}

在我看来,我认为别名是更合适的选项,因为它是单个查询,并且在该查询中我请求具有不同参数的数据。那么,在上述两个选项之间,在 GraphQL 中执行批处理查询更合适的选项是什么,为什么?谢谢!

【问题讨论】:

    标签: graphql graphql-java


    【解决方案1】:

    并非所有库都支持通过将它们的数组发送到服务器来进行批处理操作。这不是 GraphQL 的一个特性,而只是一些服务器库支持的一个方便特性。另一方面,所有 GraphQL 服务器都支持在单个操作中包含多个根级字段。因此,如果您预计您正在查询的后端将来可能会发生变化,您可能希望使用选项 #2 而不是选项 #1,以避免将来不得不重构您的代码。

    另一方面,批处理通常是可取的,因为它允许您混合操作类型。虽然您可以在单个操作中包含任意数量的根级字段,但一次只能执行一个操作——这意味着您不能将查询和突变与选项 #2 混合使用。如果这是您需要做的事情,批处理是在单个请求中实现它的唯一方法(假设您的服务器支持它)。

    【讨论】:

    • 我明白了,但就解析服务器发送的响应而言,选项#2 不是更有效的选项吗?例如,对于选项 #1,如果响应有很多嵌套类型,那么每个查询响应对象都将包含这些嵌套类型。对于批处理,您需要根据有多少对象解析相同的查询对象 X 次。但是使用选项#2,您不需要多次解析该查询对象。谢谢!
    • 是的,这是一个有效的观点,但只有在您将片段用于任何共享选择集时才真正如此。然后事情可能会快一点,但只有特别大的查询才会注意到。
    • 比较这两种方法时讨论性能有点困难,因为它归结为服务器实现。例如,我很确定 Apollo Server 会并行运行批处理操作,但可能并非所有框架或库都是如此。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2020-02-12
    • 2020-10-29
    • 2019-06-08
    • 2012-12-13
    • 2014-06-02
    • 2015-08-17
    相关资源
    最近更新 更多