哪种NoSQL数据库最适合存储层次数据?

78

哪种NoSQL数据库最适合存储分层数据?

比如说,我想要以树形结构存储论坛帖子:

original post
 + re: original post
 + re: original post
   + re2: original post
     + re3: original post
   + re2: original post

1
我的数据模型中存在一个类似的问题。Neo4j工作得很好,但无法进行水平扩展。我认为MongoDB会更好,但由于你无法在不知道顶层架构的情况下检索嵌入式“原始帖子”元素,因此它实际上比图形数据库差。 - Sridhar Sarnobat
5
也许未来属于混合数据库,比如像OrientDBArrangoDB这样将文档和图形数据库结合起来的数据库。即使是PostgreSQL现在也支持JSON文档。 - deamon
谢谢您的建议。我会仔细研究那些。 - Sridhar Sarnobat
4
过去一年中,我曾使用过Neo4j和OrientDB,它们比Mongo或Couch更适合解决这种类型的问题,尤其是需要遍历图形数据时。请注意,此处重点在于遍历图形数据。 - orangepips
13个回答

35
MongoDB和CouchDB提供了解决方案,但没有内置功能。参见这个关于在关系型数据库中表示层次结构的SO问题,因为我见过的大多数其他NoSQL解决方案在这方面都类似;当添加、删除和移动节点时,你必须编写自己的算法来重新计算那些信息。一般来说,你需要在快速读取时间(例如嵌套集模型)和快速写入时间(邻接表)之间做出决策。请参见上述SO问题以获取更多类似的选项 - 扁平表方法似乎最符合你的问题。
一个可以将这些考虑因素抽象化的标准是Java内容库(JCR),其中包括Apache JackRabbitJBoss eXo的实现。需要注意的是,幕后它们两者仍在进行某种算法计算以维护层次结构,如上所述。此外,JCR还处理权限、文件存储和其他几个方面,因此对于你的项目可能过于复杂。

“flat table approach” 的链接到 evolt.org 已经失效。 - Matthew Dutton
@MatthewDutton:已修复。 - orangepips
JCR的想法很好,但不幸的是它有一些怪癖,使得在大规模使用时成为噩梦。其中一些问题包括:
  • 它将数据存储在文件系统和关系数据库中
  • 很容易破坏版本历史记录
  • 难以存储一致的备份。
- martyglaubitz

18

3
这与“分层数据”有什么关系? - AlikElzin-kilaka
答案仍然有效,但文档链接已失效。 - Enbugger

3


2

Exist-db实现了用于XML持久化的分层数据模型。


2
在数学中,更具体地说,在图论中,树是一种无向图,在这种图中,任何两个顶点都恰好通过一条路径相连。因此,任何图形数据库都可以胜任此工作。顺便说一下,像树这样的普通图形可以简单地映射到任何关系型或非关系型数据库中。要将分层数据存储到关系型数据库中,请查看Bill Karwin所做的这个很棒的演示文稿。还有带有存储树结构功能的ORM。例如,TypeORM支持邻接列表和闭包表模式来存储分层结构。

TypeORM用于TypeScript\Javascript开发。请查找支持基于您的环境的树的ORM,检查流行的ORM

非关系型数据库中最好的 [依我之见] 就是 MongoDB。查看 文档 以了解它如何存储树形结构。树形结构是最常见的图形结构,在各个领域得到广泛应用。任何成熟的数据库解决方案都应该有处理树形结构的方法。

2

显然是LDAP技术。OpenLDAP可以轻松处理它。


2

图形数据库也可能解决这个问题。如果在可扩展性方面,neo4j不能满足您的需求,请考虑Titan,它基于包括HBase在内的各种存储后端,并且应该能够很好地扩展。它还不如neo4j成熟,但是它是一个非常有前途的项目。


1

YottaDB是另一个基于Mumps的开源数据库系统的例子。它基于FIS GT.M - Lii

0

请查看MarkLogic。您可以从网站下载演示副本。它是一种非结构化数据的数据库,属于NoSQL数据库分类。我知道非结构化数据是一个相当复杂的术语,但只需将其视为不适合关系型数据库(如分层数据)的行和列的数据即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接