Architecture 同时使用MySQL和Neo4j是个好主意吗?

Architecture 同时使用MySQL和Neo4j是个好主意吗?,architecture,mysql,hierarchical-data,neo4j,graph-databases,Architecture,Mysql,Hierarchical Data,Neo4j,Graph Databases,我将创建一个包含大量类似项(数百万)的应用程序,我希望将它们存储在MySQL数据库中,因为我希望对特定列的特定值进行大量统计和搜索 但同时,我将存储所有项之间的关系,这些项在许多连接的二叉树状结构(传递闭包)中是相关的,而关系数据库不擅长这种结构,因此我希望将所有关系存储在Neo4j中,它们对于这种数据具有良好的性能 我的计划是将除MySQL数据库中的关系和与item_id的所有关系之外的所有数据存储在Neo4j数据库中。当我想查找一棵树时,我首先在Neo4j中搜索树中的所有项id:s,然后在M

我将创建一个包含大量类似项(数百万)的应用程序,我希望将它们存储在MySQL数据库中,因为我希望对特定列的特定值进行大量统计和搜索

但同时,我将存储所有项之间的关系,这些项在许多连接的二叉树状结构(传递闭包)中是相关的,而关系数据库不擅长这种结构,因此我希望将所有关系存储在Neo4j中,它们对于这种数据具有良好的性能

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

从以下项目中选择*:项目id=45或项目id=345435或项目id=343或项目id=78或项目id=4522或项目id=676或项目id=443或项目id=4255或项目id=4345


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

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

SELECT *
FROM items
WHERE item_id IN (45, 345435, 343, 78, 4522, 676, 443, 4255, 4345)
关系数据库在存储树结构方面不好也不是完全正确的。当然,MySQL缺少一些使其更简单的功能,但大多数其他数据库都很好地支持它。Oracle有
连接方式
。大多数主流RDBMS都有某种形式的递归查询——MySQL是一个显著的例外。也许您可以看看PostgreSQL,看看它是否满足您的需要?

对此有一些想法:

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

我想这取决于你将如何处理你的图表。例如,如果您想查找连接到属性(例如名称、年龄..等等)为特定值的特定节点的所有节点,您是否需要首先在MySQL数据库中找到正确的节点ID,然后进入Neo4j?当你可以在Neo4j中完成所有这些时,这看起来很慢,而且过于复杂。所以问题是:在遍历图时是否需要节点的属性

您的数据会改变还是静态的?由于有两个独立的数据存储,这将使事情复杂化

虽然使用MySQL数据库生成统计数据可能比在Neo4j中执行所有操作都要容易,但遍历图形以查找满足定义标准的所有节点所需的代码并不太难。这些统计数据应该驱动您的解决方案

我不能评论MySQL查询选择节点ID的性能。我想这取决于需要选择多少节点以及索引策略。但在遍历图时,我同意性能方面的观点


这是一篇关于这一点的好文章:在这种情况下,当他们说“大”时,他们只表示一百万个顶点/节点和四百万条边。因此,它甚至不是一个特别密集的图形。

在这方面,我主要与二进制书呆子合作,但想添加一个变体。您可以将实时数据存储在Neo4j中,然后提取统计/报告所需的数据并放入MySQL中。对于搜索,若它适合您的需要,我会选择它。

关系数据库可以处理图形结构。其中一些甚至可以适度优雅地处理它们(就像关系数据库一样优雅!)

关系数据库中通用图形处理的关键是(RCTE),它基本上允许您通过组合选择行的根集的查询和定义迄今为止所选行的邻居的查询,在一组行上迭代(而不是递归地,尽管名称不同)扩展查询。语法有点笨拙,但它是通用和强大的

RCTE在PostgreSQL、Firebird、SQL Server和DB2中都受支持。Oracle有一个不同但等效的构造;我读到最近的版本支持正确的RCTE。MySQL不支持RCTE。如果你没有绑定到MySQL,我会敦促你考虑使用PostgreSQL,它基本上是一个更好的数据库。 然而,听起来您不需要支持一般的图形,只需要支持树。在这种情况下,您可以选择更多具体的选项

一个是经典的,但有点令人费解

一个更简单的方法是为每一行存储一个路径:这是一个字符串,表示行在树中的位置,并且具有一个属性,即节点的路径是任何子节点路径的前缀,这使您可以非常高效地执行有关祖先的各种查询(“节点A是节点B的子节点吗?”,“节点A和节点B的最低共同祖先是什么?”,等等)。例如,您可以通过从根遍历树,并使用斜杠连接途中遇到的行的ID来为行构造路径。这很容易构造,但在重新排列树时会注意维护。使用path列,您只需添加
和类似“23/%”的路径,即可将查询限制到给定树
,其中
23
是根的ID


因此,尽管图形数据库可能是存储和查询图形数据的最佳方式,但它不是唯一的选择,我建议您权衡使用图形数据库的优势与将所有数据放在一个数据库中的优势。

包含更多属性的危险在于,最终会将所有数据都塞进图形中数据库。我认为能够轻松组合多种类型的数据存储,并且能够轻松报告这些数据存储是必要的。为什么“这看起来很慢”?如果我从neo4j查询中检索id的话