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



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

  • 能够支持高度灵活和连接的域
  • 能够在ms
  • 中支持诸如"给予该项目的所有子项目和链接到该子项目的项目"之类的查询
  • 全文检索
  • 临时分析
  • 固态读写性能
  • 可伸缩性(因为我们想提供我们产品的Saas版本)

首先,我们消除了所有的RDBMS,因为我们有非常灵活的模式,也可以由客户更改(添加新字段等)。因此,在任何RDBMS中支持这样的解决方案都可能成为一场噩梦……于是我们谈到了NoSQL。我们评估了几种NoSQL存储引擎,并选择了3个最合适的(我们认为)。

MongoDB

优点:

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

缺点:

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

Neo4j:

优点:

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

缺点:

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

OrientDB

优点:

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

缺点:

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

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

我认为每一个都有有趣的权衡:

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

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

Neo4j的可扩展性得到了证明:它被用于比Facebook更大的图表,以及像沃尔玛和EBay这样的大公司。所以,如果你的问题是在Facebook社交图谱的0-120%之间,Neo4j可以帮你解决。使用Neo4j写吞吐量很好——我在笔记本电脑上每秒有超过2000个适当的ACID事务,我可以很容易地排队写,把它乘出来。

其他一切都是相当平等的:您可以选择为其中的任何一个付费,或者在他们的开源许可下自由使用它们(包括Neo4j,如果您可以使用GPL/AGPL)。Neo4j的付费许可证有很大的支持(高达24x7x365,全球1小时周转),而OrientDB的支持相当暗淡(仅在欧盟白天周转4小时),我想MongoDB也有很好的支持(尽管我还没有检查过)。

简而言之,Neo4j成为连接数据的顶级数据库是有原因的:它太棒了!

吉姆

纠正关于mongoDB的一些误解

  1. 关系通过链接到其他文档或嵌入它们来支持。请参阅mongoDB文档中的数据建模介绍了解详细信息。不过,你可能会被迫进行常态化交易,以对抗速度。然而,在某些用例中,与关系相比,嵌入是更好的解决方案。想想订单:当嵌入订单项目及其价格时,您不需要为每一个销售过的产品创建价格历史表。
  2. 不支持join。你可以通过嵌入文档来规避,如上所述。
  3. MongoDB可以用于树结构。详细信息请参见使用物化路径的模型树结构。这种方法似乎是为上述用例实现树形结构的最合适的方法。另一种选择可能是祖先数组,这取决于你的需要。

话虽这么说,mongoDB可能在一个基本要求上失败,尽管这实际上取决于您如何定义它:特设分析。我的建议是使用面向文档的方法对预期的数据结构进行建模(与在面向文档的数据库上使用关系方法相反),并使用虚拟数据对一个可能的分析用例进行原型化。

最新更新