MongoDB中有向无环图的设计模式 问题
像往常一样,问题是在数据库中显示。我选择的数据库是关系数据库,比如mysql或mongodb。我之所以选择mongoDb,是因为关系数据库中的DAG非常复杂,但如果有我没有发现的技巧,请告诉我 目标是在一个或多个MongoDB文档中映射DAG。因为我们有多个子文档和父母子文档,这是不可能的。我遇到了多种设计模式,但不确定哪一种是最好的MongoDB中有向无环图的设计模式 问题,mongodb,database-design,design-choices,nosql,Mongodb,Database Design,Design Choices,Nosql,像往常一样,问题是在数据库中显示。我选择的数据库是关系数据库,比如mysql或mongodb。我之所以选择mongoDb,是因为关系数据库中的DAG非常复杂,但如果有我没有发现的技巧,请告诉我 目标是在一个或多个MongoDB文档中映射DAG。因为我们有多个子文档和父母子文档,这是不可能的。我遇到了多种设计模式,但不确定哪一种是最好的 带祖先数组的树结构 祖先数组是。而且很容易理解。据我所知,我的文档如下所示: { "_id" : "root", "ancestors" : [
带祖先数组的树结构 祖先数组是。而且很容易理解。据我所知,我的文档如下所示:
{
"_id" : "root",
"ancestors" : [ null ],
"left": 1
}
{
"_id" : "child1",
"ancestors" : [ "root" ],
"left": 2
}
{
"_id" : "child2",
"ancestors" : [ "root", "child1" ],
"left": 1
}
db.Tree.find({ancestors: 'root'}).sort({left: -1})
db.Tree.findOne({_id: 'child1'}).ancestors
这允许我查找类似以下元素的所有子元素:
{
"_id" : "root",
"ancestors" : [ null ],
"left": 1
}
{
"_id" : "child1",
"ancestors" : [ "root" ],
"left": 2
}
{
"_id" : "child2",
"ancestors" : [ "root", "child1" ],
"left": 1
}
db.Tree.find({ancestors: 'root'}).sort({left: -1})
db.Tree.findOne({_id: 'child1'}).ancestors
所有的父母都喜欢这样:
{
"_id" : "root",
"ancestors" : [ null ],
"left": 1
}
{
"_id" : "child1",
"ancestors" : [ "root" ],
"left": 2
}
{
"_id" : "child2",
"ancestors" : [ "root", "child1" ],
"left": 1
}
db.Tree.find({ancestors: 'root'}).sort({left: -1})
db.Tree.findOne({_id: 'child1'}).ancestors
DBRefs而不是字符串
我的第二种方法是用DBRef
s替换字符串键。但是,除了较长的数据库记录之外,我看不出比祖先阵列有多少优势
具有子项和父项的基于字符串的数组
最后一个想法是不仅要存储每个文档的子文档
,还要存储它的父文档
。这将给我所有我想要的功能。缺点是我将所有关系存储两次会产生巨大的信息开销。此外,我对行政管理的数量感到担忧。例如,如果一个文档被删除,我必须在多个字段中检查所有其他文档的引用
我的问题
- 在这方面,相对于关系数据库,MongoDb是正确的选择吗
- 我错过的任何一种模式有什么好/坏的方面吗
- 你会建议哪种模式?为什么?你可能有和其中一个打交道的经验吗
为什么不使用图形数据库?检查ArangoDB,您可以使用像MongoDB这样的文档,也可以使用图形。MongoDB是一个很好的数据库,但不用于存储面向图形的文档。ArangoDB有
我可能没有食物,但你不是在改变这种模式吗?您引用祖先模式,但存储子模式。根据我的理解,如果你存储祖先而不是孩子,那么查询就容易多了,而且更易于维护。你说得对!我将相应地更新我的问题。为什么不使用图形数据库?如果您将节点存储为带有引用的文档,那么它与RDBMS解决方案没有太大区别。对其他数据库的支持不是很好,也不是不存在。所以我仅限于mongoDB或*SQL。mongoDB中的图形与SQL中的图形一样混乱,如果不是更混乱的话。当您想要使用图形时,应该使用基于图形的数据库,如Neo4j。“我把条令用作抽象层”呃。。。停止使用它怎么样?当你唯一的工具是锤子时,你将被限制在试图通过敲击锤子来解决每一个问题。