【问题标题】:Mongo Tree Data Model DesignMongo 树数据模型设计
【发布时间】:2015-06-19 01:12:06
【问题描述】:

我的目标是设计一个与垂直大小、水平大小、树不平衡和整体大小无关的可扩展递归树数据模型。

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

http://docs.mongodb.org/manual/applications/data-models-tree-structures/

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

让我们从 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 实现。

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

  1. 最大条目大小
  2. 最大堆栈大小
  3. 插入高度嵌套的集合条目会对重新排列内存中内容的引擎造成严重破坏

我最初对 Mongodb 的理解是它是为这样的模式设计而设计的。然而,当我查看文档、示例,甚至是 shell 方法时,看起来他们真的打算让它像示例 A 一样。

关于示例 A 的某些内容似乎过于相关;这就是我试图摆脱的。如果我使用示例 A,为什么不直接使用 SQL?如果我使用示例 B,我会遇到什么?

【问题讨论】:

    标签: mongodb tree schema


    【解决方案1】:

    您会遇到的一个问题是document size limit of 16MB。这对于示例 B 中的方法来说绝对是一个杀手,除了非常小的数据库。

    NoSQL 和 MongoDB 数据建模的工作方式与 SQL 数据库的数据建模根本不同。下面稍微简化了一点,但你明白了。

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

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

    此外,个用例,在这些用例中,一般 NoSQL 数据库或特别是 MongoDB 并不理想。然而,在 SQL 数据库中建模树结构通常也是一件令人头疼的事情。使用像 Neo4J 这样的树数据库可能更适合 结构的树。但是,几乎可以使用任何数据库构建商店系统或某物的类别结构。我会根据项目的几乎所有其他功能和非功能需求来选择数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多