【问题标题】:MongoDB Schema: Nested, Flattened, or Independent Collections?MongoDB Schema:嵌套、扁平化还是独立集合?
【发布时间】:2015-09-03 15:14:35
【问题描述】:

我们正在编写一个应用程序,其中有多个“项目”。每个“项目”都有多个“板”​​。每个“董事会”都有自己的一组“评论”。在 MongoDB 中构建它的推荐方法是什么?

= Option I (nested collection)
  -Project
    |
    |----- Board
             |
             |----- Comments


= Option II (flattened collection)
  -Project
    |
    |----- Board
    |
    |----- Comment
              |-----Board_ID


= Option III (independent collections)
  -Project

  - Boards
      |-----Project_ID

  - Comments
      |-----Board_ID   

有 10,000 个项目。每个项目有 5 个板,所以板总数为 50,000。每个板有 20 个 cmets,因此总 cmets 为 '1,000,000。一次只能在一个项目中打开一个板子。

因此,如果我们选择选项 I,那么要获得特定项目/板组合的关联“评论”,我们将只需要查询/解析 20 个 cmets。但是,如果我选择选项 III,那么,为了获得给定项目/板组合的相关“评论”,我们将不得不查询/解析 1,000,000 cmets。所以,理论上,选项 I 听起来更快更有效。但是,选项 I 使用嵌套集合:嵌套集合有什么缺点吗?是否有任何理由不在 MongoDB 中使用嵌套集合,例如选项 I?

MongoDB 专家:对于这种情况,推荐的做法是什么选项(I、II 或 III)?

【问题讨论】:

    标签: mongodb schema


    【解决方案1】:

    可能最重要的问题是:你一起读和写什么?

    应用程序中一次只能打开一个项目,并且可以打开一个板子。

    所以基本上1个项目及其20个cmets主要是一起读写的?然后我会将它们存储在一个文档中(嵌入comments),并有一个指向boards 集合的projects 集合。

    背景:

    • 即使您从文档中读取单个属性,您总是会从磁盘中获取整个文档并将其加载到 RAM 中。即使您将查询限制为单个属性,您也会加载它——您只是不会通过网络发送它。
    • 由于没有(多文档)事务,请将内容放入单个文档中,您希望以原子方式编写该文档。
    • 避免增加文档,因为需要将一个文档作为单个块存储在磁盘上,并且移动成本很高。预先分配值(如果可能)或为您以后要添加的内容使用单独的文档。

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2014-08-12
      • 2019-04-24
      相关资源
      最近更新 更多