16

我们目前正在为一家专业公司在内部实施类似 CRM 的解决方案。由于存储信息的性质,以及信息的不同值和键,我们决定使用文档存储数据库,因为它非常适合目的(在这种情况下,我们选择了 MongoDB)。

作为此 CRM 解决方案的一部分,我们希望存储实体之间的关系和关联,示例包括存储利益冲突信息、股东、受托人等。以最有效的方式将所有这些实体连接在一起,我们确定了一个“关系”的中心模型是必要的. 所有关系都应附有历史信息(开始和终止日期),以及不同的元数据;例如,股东关系也将包含所持股份的数量。

由于传统的 RDBMS 解决方案不适合我们以前的需求,因此在我们目前的情况下使用它们是不可行的。我试图确定的是在我们的案例中使用图形数据库是否更相关,或者实际上是否只使用 mongo 的内置关系信息是合适的。

关系信息将在整个系统中大量使用。我们希望执行的一些信息查询的示例是:

  • 获取“xyz limited”“客户”公司的所有“关键联系人”
  • 获取“john”为股东的公司的所有其他“股东”
  • 获取“abc limited”“客户”和“trust us bank limited”客户实体的所有“主要联系人”人员

鉴于这种关系的“树”结构,使用图形数据库(例如 Neo4j)是否更合适?

4

4 回答 4

8

麦克风,

您应该能够将您的关系数据存储在图形数据库中。它在遍历大图方面的高性能来自局部性,即您不会全局运行查询,而是启动一组节点(在您的情况下等于文档,由索引查找。您甚至可以存储 start-node-用于在您的 mongo 文档中快速访问的 ID)。从那里您可以在恒定时间内遍历任意大的路径(wrt 数据集大小)。

您的其他要求是什么(即数据集大小、并发访问数等、关系/图复杂性)。

您的查询非常适合图形数据库,并且用它的术语很容易表达。

我建议您只需使用像 neo4j 这样的 graphdb 并快速使用您的域来验证总体可行性,并在投资第二种技术之前找出您想回答的其他问题。

PS 如果您还没有开始,您也可以使用纯 graphdb 方法,因为图数据库是文档数据库的超集。无论如何,您宁愿在您的案例中谈论域,而不仅仅是通用文档。(例如structr是建立在 Neo4j 之上的 CMS)。

于 2011-04-29T07:28:57.503 回答
6

MongoDB 中的文档与 Neo4j 中的节点非常相似,只是没有关系。它们都具有键值属性。如果您已经选择使用 MongoDB,那么您可以使用 Neo4j 来存储关系,然后在您的应用程序中桥接存储。如果您选择新技术,您可以使用 Neo4j 处理所有内容,因为节点可以像文档一样保存属性数据。

至于关系部分,Neo4j 非常适合。你有一个图表,而不是无关的文件。在这里使用图形数据库非常有意义,并且示例查询已经写满了图形。

不过老实说,找出适合您的方法的最佳方法是进行 PoC——低成本、高价值。

免责声明:我为 Neo Technology 工作。

于 2011-04-29T18:54:35.157 回答
1

留在MongoDB。两个原因 - 1. 如果可以降低复杂性,最好留在同一个域中;2. mongodb 非常适合查询,并且比 redis 需要更少的工作,例如。

于 2011-04-28T16:00:14.150 回答
1

我们最终使用了两者,我们正在为交通网络实施搜索引擎。

一旦超过 1 或 2 个“链接”,尝试在 MongoDB 中实现关系可能会变得笨拙。本质上,您将 objectids 存储在一个数组中,如果您想实现双向关系,那么您必须实现两个单独的链接。在 Mongo 中,指向实体(或“链接”)的“指针”只是另一个文本属性(可以有不同的解释),它不像 Neo4j 中的关系那样是第一类对象。

所以我们决定使用 Neo4j 来存储关系并使用 MongoDB 来存储其他所有内容。然后挑战变成了让两家商店保持同步。

我们正在使用一个名为“MongoConnector”的 10gen 实验室项目,它是使 MongoDB 与另一个商店保持同步的机制。该项目目前不受支持,但代码可用:

http://blog.mongodb.org/post/29127828146/introducing-mongo-connector

MongoConnector 使用副本机制来实现同步。本质上,您正在监视 MongoDB OpLog,并且正在为任何 upsert(更新或插入)和删除实现回调。这个实现在 MongoConnector 中称为“DocumentManager”。我们结束了 Neo4jDocumentManager 的实现。

在查询方面,我们发现 Neo 更适合“朋友的朋友”类型的查询,而 MongoDB 更适合通用查询,即。每个处理日期的字段或范围查询。

我一直在计划进行一次演讲和一篇博文,但我还没有开始:

http://www.meetup.com/graphdb-boston/events/91703472/

这个解决方案有一些缺点,比如如果进程停止或同步速度很慢(不是实时的),事情就会不同步。

于 2013-03-26T21:21:26.050 回答