我有一个问题...
所以我环顾四周,似乎 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 个查询:
- 通过id 2获取用户
- 获取 user_id = 2 的公司
- 从查询 (2) 中获取具有 country_ids 的国家/地区
- 从查询 (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/