sql - GraphQL 和 SQL - 是否可以通过 1 个 SQL JOIN 减少数据库调用?

标签 sql node.js postgresql graphql

我有一个问题...

所以我环顾四周,似乎 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 的行星

我理解的对吗?

最佳答案

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

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

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

关于sql - GraphQL 和 SQL - 是否可以通过 1 个 SQL JOIN 减少数据库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388391/

相关文章:

postgresql - 我正在尝试为 postgresql 编写一个函数来进行一些字符串操作

SQL 2005 插入时更新列

java - 如何在 Hibernate 中使用 SELECT 进行 INSERT

ios - 原生脚本 | Firebase 通知不起作用

mysql - 处理 mysql 数据库连接

sql - 将数据从 Excel 导入到 PostgreSQL

sql - 按一列分组并对其他列求和

sql - MySql 中的关系规则

php - 两个 SELECT 语句合并为一个 SQL

javascript - router.get ('/' ) 在 expressjs 上不工作