Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB中有向无环图的设计模式 问题_Mongodb_Database Design_Design Choices_Nosql - Fatal编程技术网

MongoDB中有向无环图的设计模式 问题

MongoDB中有向无环图的设计模式 问题,mongodb,database-design,design-choices,nosql,Mongodb,Database Design,Design Choices,Nosql,像往常一样,问题是在数据库中显示。我选择的数据库是关系数据库,比如mysql或mongodb。我之所以选择mongoDb,是因为关系数据库中的DAG非常复杂,但如果有我没有发现的技巧,请告诉我 目标是在一个或多个MongoDB文档中映射DAG。因为我们有多个子文档和父母子文档,这是不可能的。我遇到了多种设计模式,但不确定哪一种是最好的 带祖先数组的树结构 祖先数组是。而且很容易理解。据我所知,我的文档如下所示: { "_id" : "root", "ancestors" : [

像往常一样,问题是在数据库中显示。我选择的数据库是关系数据库,比如mysql或mongodb。我之所以选择mongoDb,是因为关系数据库中的DAG非常复杂,但如果有我没有发现的技巧,请告诉我

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


带祖先数组的树结构 祖先数组是。而且很容易理解。据我所知,我的文档如下所示:

{
    "_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。“我把条令用作抽象层”呃。。。停止使用它怎么样?当你唯一的工具是锤子时,你将被限制在试图通过敲击锤子来解决每一个问题。