GraphQL 是否否定了对图数据库的需求

Does GraphQL negate the need for Graph Databases

大多数 reasons for using a graph database 似乎是关系数据库在进行图形查询时速度很慢。

但是,如果我将 GraphQL 与数据加载器一起使用,我的所有查询都会使用数据加载器进行展平和组合,因此您最终会进行更简单的 SELECT * FROM X 类型查询,而不是进行任何繁重的连接。我什至可能正在使用 No-SQL 数据库,它通常在处理这些类型的平面查询时非常快。

如果是这种情况,当与 GraphQL 结合使用时,是否还有 Graph 数据库的用例? Neo4j 似乎是 promoting GraphQL。有什么好处我想了解下。

是的,GraphQL 允许您进行某种图形查询,您可以从一个实体开始,然后探索它的邻域,等等。

但是,如果您需要图形查询的性能,则需要有一个 native 图形数据库。

借助 GraphQL,您可以为最终用户赋予很多权力。他可以进行深度 GraphQL 查询。

如果您有一个 SQL 数据库,您将有两个选择:

  • 计算具有大量连接的大型 SQL 查询(非常糟糕的主意)
  • 进行大量 SQL 查询以检索邻域的邻域,...

如果你有一个原生的图数据库,这将是一个性能良好的查询!是图遍历,原生图数据库就是为此而生的。

此外,如果您使用 GraphQL,您会将数据模型视为图形。因此,将其存储为图形似乎很明显,并且不会让您头疼 :)

我推荐你阅读这个post:The Motivation for Native Graph Databases


Graph Loader 的答案

使用Graph loader你会做很多小查询(这是我上面答案的第二个选择)但是等等,不,...有一个缓存记录。

图形加载器只做 batchcache

对比:

  • 您需要添加另一个库并实现逻辑(更多代码)
  • 您需要管理缓存。有很多关于这个主题的文档。 (更多内存和复杂性)
  • 由于加载程序中的 SELECT *,您总是会获得比需要更多的数据示例:我只想要用户的 idname 而不是他的 email , birthday, ...(性能较差)
  • ...

GraphQL 完全没有否定对图数据库的需求,连接非常强大,让 GraphQL 性能更高,功能更强大。

您提到:

However, if I am using GraphQL with a data loader, all my queries are flattened and combined using the data loader, so you end up making simpler SELECT * FROM X type queries instead of doing any heavy joins.

这是一个奇怪的点,因为如果你做了很多 SELECT * FROM X 并且数据是通过图形加载器连接的,你仍然在做连接,你只是在外面的软件中做它们数据库,在另一层,通过另一种方式。如果即使那个软件层也没有加入任何东西,那么你通过对数据库执行许多查询而失去的数据库连接所获得的收益,加上附加层的开销。查看对这些个体进行一系列测序的性能概况 "easy selects"。如果不进行这些连接,您可能已经失去了 30 年的计算机科学研究价值……不是让 RDMBS 优化查询执行路径,而是让 RDMBS 优化查询执行路径,它上面的软件层通过选择按哪个顺序执行哪个选择来强制执行特定路径, 那时.

按理说,如果您不必经过任何形式主义转换层(关系 -> 图),您将处于更好的位置。因为那种形式主义翻译是你每次、每次查询都必须付出的代价,无一例外。这有点等同于明显的观察结果,即 XML 数据库在执行 XPath 表达式方面比在顶部具有一些 XPath 抽象的关系数据库更好。这方面的计算机科学很简单;为任务专门构建的数据结构通常优于适应新任务的通用数据结构。

如果您想更深入地了解为什么存储格式和查询处理方法很重要,我推荐 Jim Webber's article on the motivations for a native graph database

如果不是原生图数据库怎么办?如果你在 RDBMS 之上有一个图形抽象,然后你使用 GraphQL 对 that 进行图形查询,那么你已经改变了图形遍历发生的位置和方式,但你仍然无法回避底层数据结构(表)未针对此进行优化的事实,并且您在翻译中会产生额外的开销。

因此,出于所有这些原因,原生图形数据库 + GraphQL 将是性能最高的选择,因此我得出结论,GraphQL 不会使图形数据库变得不必要,恰恰相反,它展示它们的闪光点。

它们就像巧克力和花生酱。两者都很棒,但在一起真的很棒。 :)