问题
像往常一样,问题是在数据库中显示有向无环图。我拥有的数据库选择是关系数据库,如mysql或mongodb。我选择 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 是不是关系数据库的正确选择?
- 我错过的任何模式是否有任何优点/缺点?
- 你会建议哪种模式,为什么?您可能对其中之一有经验吗?