10

问题

像往常一样,问题是在数据库中显示有向无环图。我拥有的数据库选择是关系数据库,如mysqlmongodb。我选择 mongoDb 是因为关系数据库中的 DAG 很乱,但是如果有什么我没找到的技巧,请告诉我。

目标是将 DAG 映射到一个或多个 MongoDB 文档中。因为我们有多个孩子父母的子文档,这是不可能的。我遇到了多种设计模式,但不确定哪一种最适合。


具有祖先数组的树结构

Ancestors Array由 mongoDB docs 建议。而且很容易理解。据我了解,我的文档如下所示:

{
    "_id" : "root",
    "ancestors" : [ null ],
    "left": 1
}
{
    "_id" : "child1",
    "ancestors" : [ "root" ],
    "left": 2
}
{
    "_id" : "child2",
    "ancestors" : [ "root", "child1" ],
    "left": 1
}

这使我可以find像这样的元素的所有子元素:

db.Tree.find({ancestors: 'root'}).sort({left: -1})

所有的父母都是这样的:

db.Tree.findOne({_id: 'child1'}).ancestors

DBRefs 而不是字符串

我的第二种方法是用 s 替换字符串键DBRef。但除了更长的数据库记录之外,我看不到祖先数组有很多优势。

children带有和的基于字符串的数组parents

最后一个想法是不仅存储children每个文档的,而且还存储它parents。这将为我提供我想要的所有功能。缺点是我会通过两次存储所有关系来创建大量信息开销。此外,我担心管理的数量。例如,如果一个文档被删除,我必须检查所有其他文档以获取多个字段的参考。


我的问题

  • 出于此目的,MongoDb 是不是关系数据库的正确选择?
  • 我错过的任何模式是否有任何优点/缺点?
  • 你会建议哪种模式,为什么?您可能对其中之一有经验吗?
4

1 回答 1

2

为什么不使用图形数据库?检查 ArangoDB,您可以使用 MongoDB 之类的文档以及图形。MongoDB 是一个很棒的数据库,但不适用于存储面向图形的文档。ArangoDB 可以。

https://www.arangodb.com/

于 2015-05-19T19:05:34.680 回答