【发布时间】: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 实现。
我感觉可能不是。我担心的其他问题是:
- 最大条目大小
- 最大堆栈大小
- 插入高度嵌套的集合条目会对重新排列内存中内容的引擎造成严重破坏
我最初对 Mongodb 的理解是它是为这样的模式设计而设计的。然而,当我查看文档、示例,甚至是 shell 方法时,看起来他们真的打算让它像示例 A 一样。
关于示例 A 的某些内容似乎过于相关;这就是我试图摆脱的。如果我使用示例 A,为什么不直接使用 SQL?如果我使用示例 B,我会遇到什么?
【问题讨论】: