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

时间:2018-05-02 12:18:28

标签: neo4j relational-database graphql graph-databases

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

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

如果是这种情况,当与GraphQL结合使用时,是否还有Graph数据库的用例? Neo4j似乎是promoting GraphQL。我想了解其中的优势。

2 个答案:

答案 0 :(得分:8)

GraphQL根本不能否定对图形数据库的需求,这种连接非常强大,使得GraphQL更具性能和功能。

你提到了:

  

但是,如果我将GraphQL与数据加载器一起使用,那么我的所有查询都会使用数据加载器进行展平和组合,因此您最终会进行更简单的SELECT * FROM X类型查询,而不是进行任何繁重的连接。

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

按理说,如果你不必经历任何形式主义转型(关系 - >图),你将会处于更好的位置。因为形式主义翻译是一种成本,你必须每次付费,每次查询,没有例外。这有点类似于显而易见的观察结果,即XML数据库在执行XPath表达式方面比在顶部具有一些XPath抽象的关系数据库更好。计算机科学很简单;用于任务的专用数据结构通常优于适用于新任务的通用数据结构。

如果您想深入了解存储格式和查询处理方法的重要性,我建议Jim Webber's article on the motivations for a native graph database

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

因此,出于所有这些原因,原生图形数据库+ GraphQL将成为性能最高的选项,因此我得出结论,GraphQL不会使图形数据库变得不必要,它恰恰相反,它显示了他们大放异彩。

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

答案 1 :(得分:4)

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

但是,如果您需要在图表查询中进行表演,则需要拥有原生图形数据库。

使用GraphQL,您可以为最终用户提供大量功能。他可以进行深入的GraphQL查询。

如果您有SQL数据库,则有两种选择:

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

如果您有一个本机图形数据库,它将只是一个具有良好性能的查询!这是一个图遍历,并为此制作了原生图数据库。

此外,如果您使用GraphQL,则将数据模型视为图形。所以将它存储为图形似乎很明显,让你不那么头疼:)

我建议你阅读这篇文章:The Motivation for Native Graph Databases

图形加载器的答案

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

图形加载器只需执行batchcache

比较:

  • 您需要添加另一个库并实现逻辑(更多代码)
  • 您需要管理缓存。有很多关于这个主题的文档。 (更多的记忆和复杂性)
  • 由于加载器中的SELECT *,您将始终获得比所需数据更多的数据示例:我只希望用户的idname不是他的email,{ {1}},...(性能较差)
  • ...