【问题标题】:GraphQL and SQL - Is It Possible to Reduce Database Calls with 1 SQL JOIN?GraphQL 和 SQL - 是否可以通过 1 个 SQL JOIN 减少数据库调用?
【发布时间】:2021-03-11 18:11:04
【问题描述】:

我有一个问题...

所以我一直在环顾四周,似乎 GraphQL 无法优化其解析器并将它们“组合”成一个具有多个连接的 SQL 查询。

例如,假设我们有这种想象的关系:

user(id=2) {
  name
  companies {
    name
    country {
      id
      name
      planet {
       id
       name
      }
    }
  }
}

据我所知,您可以在一个 sql 查询中获取所有这些数据:

SELECT * 
FROM users 
INNER JOIN companies ON users.id = companies.id 
INNER JOIN countries ON countries.id = companies.country_id 
INNER JOIN planets ON planets.id = countries.planet_id 
WHERE users.id = 2;

GraphQL 似乎无法实现。最多可以使用一个数据加载器,它允许我进行 4 个查询:

  1. 通过 id 2 获取用户
  2. 获取 user_id = 2 的公司
  3. 从查询 (2) 中获取带有 country_ids 的国家
  4. 从查询 (3) 中获取具有 planet_ids 的行星

我理解对了吗?

【问题讨论】:

    标签: sql node.js postgresql graphql


    【解决方案1】:

    实际上,您可以使用几种不同的方法。提供 GraphQL API 并不意味着您必须使用解析器和数据加载器方法来实现。

    您可以使用诸如 postgraphile (https://www.graphile.org/postgraphile/) 之类的 CTE,并实际编写解析器来创建单个 sql 查询。但是使用自定义解析器行为,以便在组装整个查询之前不会实际运行查询。

    我们对 Hasura GraphQL 引擎 (https://github.com/hasura/graphql-engine) 采用了不同的方法,跳过编写解析器并将 GraphQL Web 服务器编写为“编译器”,而不是将 GraphQL 编译为 SQL。

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2019-06-17
      • 1970-01-01
      • 2016-02-12
      • 2020-03-24
      • 2018-07-13
      相关资源
      最近更新 更多