【发布时间】:2015-01-18 03:53:57
【问题描述】:
使用 MongoDB 进行存储,如果我想表示节点的树结构,其中单个父节点下的子节点始终具有唯一的节点名称,我相信标准方法是使用集合并管理节点名称的唯一性在应用层面:
方法 1:基于集合的树数据方法
{ "node_name": "home", "title": "Home", "children": [
{ "node_name": "products", "title": "Products", "children": [
{ "node_name": "electronics", "title": "Electronics", "children": [ ] },
{ "node_name": "toys", "title": "Toys", "children": [ ] } ] },
{ "node_name": "services", "title": "Services", "children": [
{ "node_name": "repair", "title": "Repair", "children": [ ] },
{ "node_name": "training", "title": "Training"", "children": [ ] } ] } ] }
然而,我想到了以下替代方法,其中节点名称变为“对象映射”字段名称,我们完全不使用集合:
方法 2:基于对象映射的方法(无集合)
// NOTE: We don't have the equivalent of "none_name":"home" at the root, but that's not an issue in this case
{ "title": "Home", "children": {
"products": { "title": "Products", children": {
"electronics": { "title": "Electronics", "children": { } },
"toys": { "title": "Toys", "children": { } } } },
"services": { "title": "Services", children": {
"repair": { "title": "Repair", "children": { } },
"training": { "title": "Training", "children": { } } } } } }
问题是:
严格从 MongoDB 的角度来看(考虑查询、性能、数据可维护性以及数据大小和服务器扩展),方法 #2(超过 #1)是否存在任何重大问题?
编辑:在更好地了解了 MongoDB 之后(感谢下面 Neil 的 cmets),我意识到这个问题的两个选项通常都是错误的,因为他们认为它在单个 MongoDB 文档中存储多个节点是有意义的。最终,每个“节点”都应该是一个单独的文档,并且(正如 Neil Lunn 在 cmets 中所说)有多种方法可以实现层次结构树,如下所示:Model Tree Structures in MongoDB
【问题讨论】:
-
两者都不是很好,对于任何合理大小的东西,您可能应该将其展平。这是一个常见的数据建模任务,不仅适用于 MongoDB,因此已经详细讨论了好的方法。手册本身有关于Modelling Tree Structures 的整个部分,这可能比这里提供的任何回复都更全面。
-
总的来说,我同意,但我在这里发帖是因为 AFAIK 没有 MongoDB 文档涉及使用基于字段的地图来表示概念上独立的实体的方法,中间没有集合(或引用)。
-
我主要推荐你去那里,因为除非你绝对不打算修改你的“树结构”或以任何方式遍历它,否则“那些建议”比将所有内容存储在单个文档中要好得多收藏。有两种方法可以考虑一个你找不到类似的想法。 1. 要么全新,要么辉煌 2. 人家考虑过,问题多多。
标签: mongodb dictionary tree data-modeling nosql