MongoDB架构设计建议

时间:2017-04-04 15:27:53

标签: mongodb database-design mongoose schema

我已经使用了MongoDB一段时间,但是当其他人已经完成了设计架构的细节任务时,我只用它做 CRUD 操作。所以,基本上这是我第一次设计架构,我需要一些建议。 我将从用户收集的数据是他们的常规信息,他们的健康相关信息以及他们的保险相关信息。单个用户不会有多个健康和保险相关信息,因此它是一个简单的一对一关系。但这些与健康和保险相关的信息将涉及许多领域。所以我的问题是。以健康和保险相关信息单独收集是否合适:

     var userSchema = {
              name : String,
              age  : Number,
    health_details :  [{ type: Schema.Types.ObjectId, ref: 'Health' }],//reference to healthSchema
 insurance_details :  [{ type: Schema.Types.ObjectId, ref: 'Insurance' }] //reference to insuranceSchema    
     }

或拥有包含大量字段的单个集合:

     var userSchema = {
              name : String,
              age  : Number,
          disease_name : String, // and many other fields related to health
          insurance_company_name : String //and many other fields related to insurance
     }

1 个答案:

答案 0 :(得分:1)

通常,在NoSql中对1对1,1对多对和多对多数据建模时可以考虑的一些因素是:

<强> 1。数据重复

您是否希望数据重复?而且这也不是像业余爱好和#34;园艺&#34;这样的一个词,许多用户都可以拥有,而且可能不需要&#34;爱好&#34;收藏,但像作家和书籍。这种情况保证了重复。

作者可以写很多书。你不应该在两本书中嵌入作者。当作者信息发生变化时,很难维护。使用1对多。并且可以参考两个文档中的任何一个。因为&#34;有很多&#34; (作者中的bookIds数组)或&#34;属于&#34; (每本书中的作者)。

如果是健康和保险,由于不期望数据重复,单个文档是更好的选择。

<强> 2。读/写偏好

数据读取和写入的预期频率是多少(不是收集)?例如,您比更新用户,他的健康和保险记录更频繁地查询(如果1和3不是一个问题),那么这些数据最好应该包含在单个文档中,而不是从三个不同的来源查询。

此外,一个文档是Mongodb保证原子性的原因,如果您想同时更新用户,健康和保险(例如在一个API中),这将是一个额外的好处。

第3。文件大小

考虑一下:许多用户可以喜欢帖子而用户可以喜欢很多帖子(多对多)。并且由于您需要确保没有用户喜欢两次帖子,因此必须将用户ID存储在某处。三个可用选项:

  • 将用户ID数组保留在帖子文档中
  • 将post ids数组保留在用户文档中
  • 创建另一个包含两者的ID的文档(仅限多对多解析,类似于SQL)

如果超过一百万用户喜欢帖子,帖子文档将溢出用户引用。类似地,用户可以在短时间内喜欢数千个帖子,因此第二个选项也是不可行的。这给我们留下了第三个选项,这是本案的最佳选择。

但是帖子可以有很多评论,评论只属于一个帖子(1对多)。现在,评论你几乎不会期望超过几百。很少有。因此,在post中保留一个commentIds(或嵌入的注释本身)数组是一个实用的解决方案。

在您的情况下,我不相信没有保留大量引用列表的文档可能会增长到足以达到16 MB(Mongo文档大小限制)。因此,您可以安全地将健康和保险数据存储在用户文档中。但他们应该拥有自己的钥匙:

 var userSchema = {
          name : String,
          age  : Number,
          health : {
             disease_name : String,
             //more health information
          },
          insurance :{
             company_name : String,
             //further insurance data
          }
 }

在我看来,你应该如何考虑设计你的架构。我建议您阅读Couchbase提供的这些非常有用的指南,以进行数据建模:Document design considerationsmodeling documents for retrievalmodeling relationships。尽管与Couchbase有关,但规则同样适用于mongodb模式设计,因为它们都是NoSql和面向文档的数据库。