Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 Mongo树数据模型设计_Mongodb_Tree_Schema - Fatal编程技术网

Mongodb Mongo树数据模型设计

Mongodb Mongo树数据模型设计,mongodb,tree,schema,Mongodb,Tree,Schema,我的目标是设计一个可伸缩的递归树数据模型,该模型与垂直大小、水平大小、树不平衡和总体大小无关 在Mongo的网站上,他们在这里讨论树结构数据: 有趣的是,它们呈现的每个数据模型都表示一个集合中的新条目;即使对于子元素也是如此 让我们从mongodb.org调用以下示例A: db.categories.insert( { _id: "MongoDB", parent: "Databases" } ) db.categories.insert( { _id: "dbm", parent: "Dat

我的目标是设计一个可伸缩的递归树数据模型,该模型与垂直大小、水平大小、树不平衡和总体大小无关

在Mongo的网站上,他们在这里讨论树结构数据:

有趣的是,它们呈现的每个数据模型都表示一个集合中的新条目;即使对于子元素也是如此

让我们从mongodb.org调用以下示例A:

db.categories.insert( { _id: "MongoDB", parent: "Databases" } )
db.categories.insert( { _id: "dbm", parent: "Databases" } )
db.categories.insert( { _id: "Databases", parent: "Programming" } )
db.categories.insert( { _id: "Languages", parent: "Programming" } )
db.categories.insert( { _id: "Programming", parent: "Books" } )
db.categories.insert( { _id: "Books", parent: null } )
现在,让我们把这个例子称为B:

singleEntry =
{
    _id: "Books",
    children:
    [
        {
            _id: "Programming",
            parent: "Books",
            children:
            [
                {
                    _id: "Languages",
                    parent: "Programming"
                },
                {
                    _id: "Databases",
                    parent: "Programming",
                    children:
                    [
                        {
                            _id: "MongoDB",
                            parent: "Databases"
                        },
                        {
                            _id: "dbm",
                            parent: "Databases"
                        }
                    ]
                }
            ]
        }
    ]
}

db.categories.insert(singleEntry)
我真的很喜欢例子B;尽管双重引用父子关系是令人不安的冗余,但在实际使用中我无法找到避免这种情况的方法。此外,查询更为复杂:

db.categories.find(
    {
        'children.children.children._id' : 'MongoDB'
    }
)
但我不介意,只要示例A中的所有内容在示例B中都是可能的

我感觉可能不是这样。我担心的其他问题包括:

  • 最大入口大小
  • 最大堆栈大小
  • 插入到高度嵌套的集合项中会对引擎造成严重破坏,从而重新排列内存中的内容
  • 我对Mongodb的最初理解是,它用于这样的模式设计。然而,当我查看文档、示例,甚至shell方法时,看起来他们真的希望它像示例A一样


    关于例子A的某些东西似乎太过相关;这正是我想要摆脱的。如果我使用示例A,为什么不使用SQL呢?如果我使用示例B,我会遇到什么问题?

    您将遇到的一个问题是。对于示例B中的方法来说,除了非常小的数据库之外,这是一个绝对的杀手

    NoSQL和MongoDB的数据建模工作原理与SQL数据库的数据建模工作原理有根本不同。下面的内容稍微简化了一点,但你可以理解

    使用SQL数据库,您可以根据实体对数据进行建模,并确定它们之间的关系。在下一步中,您将尝试确定如何回答用例中出现的问题

    在MongoDB数据建模中,首先确定用例中出现的问题,然后对数据进行相应建模,以最有效的方式回答问题

    此外,在一些用例中,NoSQL数据库通常或MongoDB都不是理想的。然而,在SQL数据库中建模树结构通常也是一件棘手的事情。使用像Neo4J这样的树数据库可能更适合于高度结构化的树。然而,商店系统或某物的类别结构几乎可以用任何数据库构建。我会根据项目的几乎任何其他功能性和非功能性需求来选择数据库