Mongo Tree数据模型设计

时间:2015-04-13 16:17:38

标签: mongodb tree schema

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

在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. 插入高度嵌套的集合条目,在引擎上创建破坏,重新排列内存中的内容
  4. 我对Mongodb的初步了解是,它是用于这样的架构设计。但是,当我查看文档,示例,甚至是shell方法时,看起来他们真的希望它像示例A.

    关于例子A的东西似乎太过关系了;这是我试图摆脱的那种。如果我使用示例A,为什么不使用SQL?如果我用例子B,我可以期待遇到什么?

1 个答案:

答案 0 :(得分:3)

您将遇到的一个问题是document size limit of 16MB。这是样本B中方法的绝对杀手,除了非常小的数据库。

NoSQL - 和MongoDB - 数据建模与SQL数据库的数据建模根本不同。以下是一点点简化,但你得到了图片。

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

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

此外,用例,其中一般的NoSQL数据库或MongoDB具体不是理想的。但是,在SQL数据库中建模树结构通常也是一个痛苦的问题。使用像Neo4J这样的树数据库可能更适合重度结构化树。但是,几乎任何数据库都可以构建商店系统或类似的类别结构。我根据项目的几乎任何其他功能和非功能需求选择数据库。