【问题标题】:MongoDb - Embedding or reference?MongoDb - 嵌入或引用?
【发布时间】:2014-10-26 20:33:28
【问题描述】:

我来自 SQL 关系世界,有一个涉及 mongodb 架构设计的问题。

我需要表达的现实包含: 用户和月度报告(包含多个每日报告)。

我想弄清楚是否在 mongodb 中,最好将报告对象嵌入到 Users 集合中,或者有 2 个由 id 引用的单独集合。

Embedded solution:
User:{
     name:
     surname:
     monthlyReports: [{
                month: "January 2014"
                dailyReport: [{
                      day: 1
                      singleReport: [
                         { report1}, {report2}, ...
                      ]
                }, {
                     day: 2
                     singleReport: [ 
                         { report1}, {report2}, ...
                     ]
                }
                ]
           },
           {
            /*
               february 2014
               Day 1
               Day 2 ...
             */
           } ...
     ]
}

Referenced solution:
Users:{
     name:
     surname:
     monthlyReports: [
             id_reportMonth1, id_reportMonth2, ...
     ]
}

MonthlyReport: {
       id:
       month:
       dailyReport: [{
                    day: 1
                    singleReport: [
                            { report1 }, { report2 } ...
                    ]
               },
               {
                } ....
       ]
}

对于单用户,我需要检索单日报表、月报表和总报表。

我认为在嵌入式解决方案中,查询更简单,但创建大对象的周期较长。

另一种可能性: 创建 3 个引用集合: 用户、月报、日报。

有什么更好的方法吗? 有人建议了吗?

【问题讨论】:

标签: mongodb schema


【解决方案1】:

Mongo 写了一篇关于它的优秀的 3 部分博客文章:http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1

底线:这取决于用途。

您需要考虑两个因素(参考:mongodb 博客文章):

  1. One-to-N 中“N”侧的实体是否需要独立存在?
  2. 关系的基数是什么:是一对多吗?一对多;还是一对一?

基于这些因素,您可以选择三种基本的一对 N 架构设计之一:

  1. 如果基数是一对多并且没有 需要访问父上下文之外的嵌入对象 对象
  2. 如果基数为 N 端对象,则使用一个引用数组 是一对多的,或者如果 N 侧对象应该独立于任何 原因
  3. 在 N 侧对象中使用对 One-side 的引用,如果 基数是一对数

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2013-05-16
    • 2014-09-29
    相关资源
    最近更新 更多