像往常一样,问题是在数据库中显示directed acyclic graph。我拥有的数据库的选择是关系数据库,如 mysql 或 mongodb 。我选择了mongoDb,因为关系数据库中的DAG是a mess但是如果有一个技巧我就是没找到,请告诉我。
目标是在一个或多个MongoDB文档中映射DAG。因为我们有多个孩子和父母 SubDocuments ,这是不可能的。我遇到了多种设计模式,但我不确定哪种模式最适合。
祖先阵列是suggested by the 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
我的第二种方法是用DBRef
替换字符串键。但是除了更长的数据库记录之外,我没有看到比祖先数组更多的优势。
children
和parents
最后一个想法是不仅要存储每个文档的children
,还要存储parents
。这会给我所有我想要的功能。缺点是我将通过存储所有关系两次创建的大量信息开销。此外,我担心管理的数量。例如。如果文档被删除,我必须在多个字段中检查所有其他文档以供参考。
答案 0 :(得分:1)
为什么不使用图表数据库?检查ArangoDB,您可以使用MongoDB等文档以及图形。 MongoDB是一个很棒的数据库,但不适用于存储面向图形的文档。 ArangoDB确实如此。