我会让一个应用程序与很多类似的项目(百万),我想将它们储存在一个数据库,因为我想要做大量的统计数据和搜索的具体的值,具体列。

但在同一时间,我将储存之间的关系的所有项目,这是相关的,在许多接二树形结构(传递关闭),和关系数据库并不是良好的,在这种结构,所以我想保存的所有关系在Neo4j其有良好的业绩对于这种数据。

我的计划是把所有数据,除了关系数据库和所有关系 item_id 存储在Neo4j数据库。当我想要查找一棵树,我第一次搜索Neo4j所有的 item_ids在树,然后我搜索MySQL-数据库为所有指定的项目在查询这看起来像:

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

这是一个很好的想法,我非常错误的? 我没有用过图形数据库之前。是否有任何更好的方法来我的问题吗?怎么会MySQL-查询执行在这种情况下?

有帮助吗?

解决方案

几个想法:

我会尝试的模拟你Neo4j域模型,以包括性中每个节点的曲线图。通过分离数据分成两个不同的数据存储你可能会限制一些操作,你可能希望做到的。

我想这可以归结为什么你会做你的曲线图。例如,如果你想要找到的所有节点相连的一个特点,其属性(即姓名、年龄..什么)些价值观,你会首先必须找到正确的节点ID在你的数据库,然后进入Neo4j?这似乎只是缓慢和过于复杂,当你能做所有这一切都在Neo4j.因此,问题是:你会需要属性的一个节点在历图?

将你的数据更改或者它是静态的?通过具有两个独立的数据存储,它将使问题复杂化。

虽然产生的统计数据使用一个数据库可能更易于做一切在Neo4j,代码需要穿越一个曲线图来寻找所有节点,以满足一个定义的标准是不是过于困难。这些统计数据都应该推动解决方案。

我不能评论有关业绩的MySQL查询以选择的节点标识。我想这下来到多少的节点,你会需要选择和你的编制索引的战略。我同意有关性能方面的事情的时候穿过一个曲线图,虽然。

这是一个很好的文章就是这样: MySQL与Neo4j在一个大规模的图穿越 在这种情况下,当他们说大,他们只意味着一个百万顶点/节点和四百万的边缘。因此,它甚至不是一个特别密集的图表。

其他提示

关系数据库可以处理的图表的结构。他们中的一些甚至可以处理它们的适度优雅(作为优雅的关系数据库。).

关键的一般图处理的关系数据库是的 递常见的表达 (RCTE),这基本上可以让你迭代地(不递归的,尽管名称)扩大一个查询过一套行,通过合并查询其选择的一个根本的行集和查询其中定义了邻国的行选为止。该法是一个有点笨重的,但它的一般和强大的。

RCTEs支持在PostgreSQL、火鸟,SQL服务器,而且显然在DB2。Oracle有一个不同但相当于构建;我已经阅读,最近的版本,支持适当的RCTEs.MySQL不支持RCTEs.如果你是不是拘泥于MySQL,我敦促你以考虑使用PostgreSQL,这基本上是一个更好的数据库。

但是,听起来好像你不需要支持一般图表,只是树木。在这种情况下,有更多的具体选择向你敞开。

一个是经典而是mindbending 套套.

一个更简单一个是储存的道路与各个行:这是一个串其代表行的在树中的位置,并拥有财产的路径为一个节点为前缀的道路的任何子节点,它可以非常有效地做各种各样的查询有关的祖先("节点是一个一个孩子的B节点?", "什么节点和节点B的最低共同的祖先?", 等等)。例如,可以构建一个路径的行走的树根,并加入身份证的排上遇到的方式,用斜线。这是简单的建造,但并照顾到维持,如果你重新树。有一个路径柱,可以限制查询到一定树仅仅通过增加 and path like '23/%', ,哪里 23 是根本的身份证。

因此,虽然图表数据库可能是最好的方式来存储和查询图数据,但它不是唯一的选择,并且我建议你重的优势,利用一个反对的优势具有所有你的数据在一个单一的数据库。

我大部分是二进制的书呆子上的这一点,但想添加一个变化。你可以存活数据Neo4j然后提取你需要的数据用于统计信息/报告和投入MySQL.对于搜索的我会去的 Neo4j-分类:设一体化 如果适合你的需要。

你可以改善查询通过使用:

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

它也不完全正确的,关系数据库是坏的储存树形结构。当然MySQL是缺少某些功能,这将使它更加容易,但大多数其他数据库支持它。Oracle CONNECT BY.大多数的主流RDBMS有某种形式的递归查询-MySQL是一个明显的例外。也许你可以来看看PostgreSQL,看看是否能满足你的需要?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top