为高度连接和灵活的域选择正确的NoSQL存储

时间:2014-05-22 08:48:06

标签: mongodb neo4j orientdb

我们正在开始一个新项目并为我们的案例寻找合适的存储解决方案。 存储的主要要求如下:

  • 支持高度灵活和连接的域的能力
  • 支持ms“
  • ”等“给予该项目的所有孩子和与该子项相关联的项目”的查询
  • 全文搜索
  • Ad hoc analytics
  • 稳定的读写性能
  • 可扩展性(因为我们想提供产品的Saas版本)

首先,我们淘汰了所有RDBMS,因为我们拥有非常灵活的架构,也可以由客户更改(添加新字段等), 所以在任何RDBMS中支持这样的解决方案都会成为一场噩梦...... 我们来到NoSQL。我们评估了Sevaral NoSQL存储引擎,并选择了3个最合适的(我们认为)。

MongoDB的

优点:

  • 适合存储结构灵活的聚合体(正如我们所拥有的那样) 它们)
  • 可扩展性/成熟/支持/社区
  • 在以前的项目中使用MongoDB的经验
  • 驱动程序,云支持
  • Analitycs
  • 价格(免费)

缺点:

  • 不支持关系(对我们来说非常重要,因为我们有很多关联项目)
  • 缓慢检索连接数据(所有联接都发生在应用程序中)

的Neo4j:

优点:

  • 在建模中支持连接数据,灵活性
  • 快速检索互连数据
  • 驱动程序,云支持
  • 成熟度/支持/ Comminity(如果我们与其他图表Dbs比较)

缺点:

  • 不支持聚合存储(我们希望聚合在一个顶点而不是几个)
  • 可扩展性(据我所知,现在所有数据都在其他服务器上重复)
  • Analitics?
  • 写性能? (阅读几个客户抱怨其写作表现的博客)
  • 价格(商业软件不是免费的)

OrientDB

优点:

  • 似乎OrientDB具有我们需要的所有功能(聚合和graphdb在一个解决方案中)
  • 价格(看起来像是免费的)

缺点:

  • 不成熟(与其他人相比)
  • 技术背后的小公司(特别是一个主要贡献者),所以关于支持,已知问题等问题。
  • 很多功能,但它们能很好地运作

所以现在,Neo4j和OrientDB之间存在的主要困境(MongoDb是第三种选择,因为它缺乏在我们的案例中非常重要的关系 - this post解释了陷阱)。我搜索了这些dbs的任何基准/比较,但所有这些都是旧的。以下是功能http://vschart.com/compare/neo4j/vs/orientdb的比较。所以现在我们需要已经使用过这些dbs的人的建议,选择什么。提前致谢。

2 个答案:

答案 0 :(得分:2)

我认为每种方法都有一些有趣的权衡:

  • MongoDB不做图表;
  • Neo4j的节点是平键值属性;
  • OrientDB强制您在图形和文档之间进行选择(不能同时进行)。

所以你的选择是在图形商店(neo4j或orient)和文档商店(mongo或orient)之间。我的感觉是MongoDB是领先的文档存储,而Neo4j是领先的图形数据库,它将引导我选择其中一个。但由于连接很重要,我倾向于使用图形数据库并使用Neo4j。

Neo4j的可扩展性已得到证实:它适用于大于Facebook的图形以及沃尔玛和EBay等大公司。因此,如果您的问题在Facebook社交图的0-120%之间,Neo4j可以让您满意。使用Neo4j可以很好地写入吞吐量 - 我在笔记本电脑上每秒可以获得超过2,000个正确的ACID事务处理,并且我可以轻松地将写入排队等多个。

其他一切都非常平等:您可以选择支付其中任何一项或在其开源许可下自由使用它们(如果您可以使用GPL / AGPL,则包括Neo4j)。 Neo4j的付费许可证得到了极大的支持(全天24x7x365,全天1小时的转变),而OrientDB的支持相当平淡(仅限欧盟白天4小时的转变),我认为MongoDB也有很好的支持(尽管我还没有检查过)。

简而言之,Neo4j是连接数据的顶级数据库是有原因的:它踢屁股!

吉姆

答案 1 :(得分:2)

纠正有关mongoDB的一些误解

  1. 通过链接到其他文档或嵌入它们来支持 。有关详细信息,请参阅Data Modeling Introduction in the mongoDB docs。但是,你可能会被迫对速度进行标准化交易。但是,有些用例与关系相比,嵌入是更好的解决方案。想一想订单:在嵌入订单商品及其价格时,您不需要为每件售出的产品都有价格历史表。
  2. 不支持的是JOIN。如上所述,您可以通过嵌入文档来避免这种情况。
  3. MongoDB可用于树结构。有关详细信息,请参阅Model Tree Structures with Materialized Paths。这种方法似乎是为上述用例实现树结构的最合适方法。另一种选择可能是array of ancestors,具体取决于您的需求。
  4. 话虽这么说,mongoDB可能在一个基本要求中失败,尽管这实际上取决于你如何定义它:临时分析。我的建议是使用面向文档的方法建模目标数据结构(与在面向文档的数据库上放置关系方法相反),并将一个可能的分析用例与虚拟数据进行原型化。 / p>