我的目标是设计一个可扩展的递归树数据模型,该模型与垂直大小,水平大小,树不平衡和整体大小无关。
在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,我可以期待遇到什么?
答案 0 :(得分:3)
您将遇到的一个问题是document size limit of 16MB。这是样本B中方法的绝对杀手,除了非常小的数据库。
NoSQL - 和MongoDB - 数据建模与SQL数据库的数据建模根本不同。以下是一点点简化,但你得到了图片。
使用SQL数据库,您可以根据实体对数据建模并确定彼此之间的关系。在下一步中,您将尝试确定如何回答用例中出现的问题。
在MongoDB数据建模中,您首先要确定用例中出现的问题,然后相应地对数据建模,以便以最有效的方式回答您的问题。
此外,是用例,其中一般的NoSQL数据库或MongoDB具体不是理想的。但是,在SQL数据库中建模树结构通常也是一个痛苦的问题。使用像Neo4J这样的树数据库可能更适合重度结构化树。但是,几乎任何数据库都可以构建商店系统或类似的类别结构。我根据项目的几乎任何其他功能和非功能需求选择数据库。