【问题标题】:MongoDB: Tree Node Structure with Object-Maps instead of CollectionsMongoDB:使用对象映射而不是集合的树节点结构
【发布时间】: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


【解决方案1】:

我认为这个用例不适合 Mongo DB,因为:

  • 有(MongoDB 2.6)无压缩算法(您的文档会太大)
  • Mongo DB 使用数据库级锁(当你想要一个大文档时,所有 DB 操作都会被阻塞)
  • 很难编入索引

我认为更好的解决方案是这个用例的一些关系数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2019-10-21
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多