GraphQL—执行批处理查询时使用别名与使用多个查询对象之间的区别

GraphQL—执行批处理查询时使用别名与使用多个查询对象之间的区别,graphql,graphql-java,Graphql,Graphql Java,我是GraphQL的新手,所以如果我在需要的地方错了,请纠正我。我想知道在单个请求中执行批处理查询的最佳方式或最合适的方式是什么。我见过这样做的例子: [ { query: "query(param1)" }, { query: "query(param2)" } ] 或使用别名完成相同任务的示例: query { alias1: resolver1(param1) alias2: resolver2(param2) } 在我看来,我认为别名是更合适的

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

[
  {
    query: "query(param1)"
  },
  {
    query: "query(param2)"
  }
]
或使用别名完成相同任务的示例:

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

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

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


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

并非所有库都支持通过向服务器发送一系列批处理操作。这不是GraphQL的一个特性,而只是一些服务器库支持的一个方便的特性。另一方面,所有GraphQL服务器都支持在单个操作中包含多个根级别字段。因此,如果您预计要查询的后端将来可能会更改,那么您可能希望使用选项2而不是选项1,以避免将来可能需要重构代码


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

我明白了,但就解析服务器发送的响应而言,选项2不是更有效的选项吗?例如,使用选项#1,如果响应有许多嵌套类型,则每个查询响应对象都将包含这些嵌套类型。对于批处理,需要根据对象的数量对同一查询对象进行X次解析。但是使用选项2,您不需要多次解析该查询对象。谢谢是的,这是一个有效的观点,但只有当您将片段用于任何共享选择集时,这才是真的。然后事情可能会快一点,但这只会在特别大的查询中引起注意。在比较这两种方法时,讨论性能有点困难,因为这取决于服务器实现。例如,我很确定Apollo Server并行运行批处理操作,但并非所有框架或库都是如此。不过,我知道,就解析服务器发送的响应而言,选项2不是更有效的选项吗?例如,使用选项#1,如果响应有许多嵌套类型,则每个查询响应对象都将包含这些嵌套类型。对于批处理,需要根据对象的数量对同一查询对象进行X次解析。但是使用选项2,您不需要多次解析该查询对象。谢谢是的,这是一个有效的观点,但只有当您将片段用于任何共享选择集时,这才是真的。然后事情可能会快一点,但这只会在特别大的查询中引起注意。在比较这两种方法时,讨论性能有点困难,因为这取决于服务器实现。例如,我非常确定Apollo Server并行运行批处理操作,但并非所有框架或库都是如此。