MongoDb - 嵌入还是引用?

时间:2014-10-26 11:58:39

标签: mongodb schema

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

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

我想弄明白,在mongodb中,将嵌入式报表对象更好地嵌入到Users集合中,还是有两个由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个引用的集合: 用户,monthlyReport,dailyReport。

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

1 个答案:

答案 0 :(得分:1)

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

底线:这取决于使用情况。

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

  1. One-to-N的“N”侧的实体是否需要独自站立?
  2. 这种关系的基数是什么:它是一对一的;一个一对多的;还是一对一的?
  3. 基于这些因素,您可以选择三种基本的一对一架构设计中的一种:

    1. 如果基数是一对一而且没有基数,则嵌入N侧 需要访问父级上下文之外的嵌入式对象 对象
    2. 如果是基数,则使用对N侧对象的引用数组 是一对多的,还是N面的物体应该独立存在 原因
    3. 如果是,则使用对N侧对象中的单侧的引用 基数是一对多的
    4. 希望这有帮助。