使用MySQL和Neo4j是一个好主意吗?

我会用很多类似的项目(数百万)做一个应用程序,并且我想将它们存储在一个MySQL数据库中,因为我想要做大量的统计数据并search特定列的特定值。

但是同时,我将把所有项目之间的关系存储起来,这些项目在许多连接的二叉树状结构(传递闭包)中是相关的,而关系数据库不擅长这种结构,所以我想存储Neo4j中对这种数据有良好performance的所有关系。

我的计划是除了MySQL数据库中的关系之外的所有数据以及存储在Neo4j数据库中的与item_id所有关系。 当我想查找一棵树时,我首先在Neo4j中search树中的所有item_id :s,然后在查询中searchMySQL数据库中的所有指定项目,如下所示:

SELECT * FROM items WHERE item_id = 45 OR item_id = 345435 OR item_id = 343 OR item_id = 78 OR item_id = 4522 OR item_id = 676 OR item_id = 443 OR item_id = 4255 OR item_id = 4345

这是一个好主意,还是我错了? 我以前没有使用过graphics数据库。 有没有更好的方法来解决我的问题? 在这种情况下MySQL查询将如何执行?

几点想法:

我会尝试build模你的Neo4j领域模型,在图中包含每个节点的属性。 通过将数据分离到两个不同的数据存储中,可能会限制您可能想要执行的一些操作。

我想这归结于你将用你的图表做什么? 例如,如果想要查找连接到特定节点的所有节点,那么其属性(即name,age .. whatever)是一定的值,您首先必须在MySQL数据库中find正确的节点ID,然后进入Neo4j。 当你可以在Neo4j中完成所有这些时,这看起来很慢并且过于复杂。 所以问题是你遍历图时是否需要节点的属性?

你的数据会改变还是静态的? 通过拥有两个独立的数据存储,将会使问题复杂化。

虽然使用MySQL数据库生成统计信息可能比在Neo4j中做所有事情更容易,但是遍历图来查找所有满足定义标准的节点所需的代码并不是太困难。 这些统计数据应该推动你的解决scheme。

我不能评论MySQL查询select节点ID的性能。 我想这要归结为您需要select多less个节点以及您的索引策略。 我同意关于遍历一个图表的事情。

这是一个很好的文章: 在大规模图遍历上的MySQL和Neo4j ,在这种情况下,当它们说大的时候,它们只意味着一百万个顶点/节点和四百万个边。 所以它甚至不是一个特别密集的图表。

关系数据库可以处理graphics结构。 他们中的一些甚至可以轻而易举地处理它们(就像关系数据库一样优雅!)。

关系数据库中的一般图处理的关键是recursion公用表expression式 (RCTE),它基本上允许您通过组合一个查询select一个根集来迭代(而不是recursion的,尽pipe名称)行和查询定义到目前为止select的行的邻居。 语法有点笨拙,但它通用而且function强大。

PostgreSQL,Firebird,SQL Server和DB2显然支持RCTE。 Oracle有一个不同的但是相当的构造; 我读过最近的版本支持正确的RCTEs。 MySQL不支持RCTE。 如果你不熟悉MySQL,我会敦促你考虑使用PostgreSQL,它基本上是一个更好的数据库。

但是,这听起来像你不需要支持一般graphics,只是树木。 在这种情况下,您可以select更具体的选项。

一个是经典的,但是比较灵活的嵌套集合 。

一个简单的方法是在每一行中存储一个path:这是一个表示行在树中的位置的string,并且具有节点的path是任何子节点的path的前缀的属性,这使得您可以非常有效地做关于祖先的各种查询(“节点A是节点B的孩子吗?”,“节点A和节点B的最低共同祖先是什么?”等)。 例如,您可以通过从根目录树行,并用斜线连接在路上遇到的行的ID来构build行的path。 这个构build起来很简单,但是如果重新排列树,还是要小心。 使用path列,您可以简单地通过添加and path like '23/%' ,其中23是根的ID来限制对给定树的查询。

因此,虽然graphics数据库可能是存储和查询graphics数据的最佳方法,但它不是唯一的select,我build议您衡量使用一个数据库的好处,即将所有数据存储在单个数据库中。

我主要是在这个二元书呆子,但想补充一个变化。 您可以将实时数据存储在Neo4j中,然后将统计/报告所需的数据提取出来并存入MySQL。 对于search,我会去与Neo4j-Lucene集成,如果这符合您的需求。

您可以通过使用IN来改进查询:

 SELECT * FROM items WHERE item_id IN (45, 345435, 343, 78, 4522, 676, 443, 4255, 4345) 

关系数据库在存储树结构上不好,这也不完全正确。 当然,MySQL缺less一些使其更容易的function,但大多数其他数据库都支持它。 Oracle有CONNECT BY 。 大多数主streamRDBMS都有某种forms的recursion查询–MySQL是一个明显的例外。 也许你可以看看PostgreSQL,看看是否能满足你的需求?