我已经使用了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
}
答案 0 :(得分:1)
通常,在NoSql中对1对1,1对多对和多对多数据建模时可以考虑的一些因素是:
<强> 1。数据重复
您是否希望数据重复?而且这也不是像业余爱好和#34;园艺&#34;这样的一个词,许多用户都可以拥有,而且可能不需要&#34;爱好&#34;收藏,但像作家和书籍。这种情况保证了重复。
作者可以写很多书。你不应该在两本书中嵌入作者。当作者信息发生变化时,很难维护。使用1对多。并且可以参考两个文档中的任何一个。因为&#34;有很多&#34; (作者中的bookIds数组)或&#34;属于&#34; (每本书中的作者)。
如果是健康和保险,由于不期望数据重复,单个文档是更好的选择。
<强> 2。读/写偏好
数据读取和写入的预期频率是多少(不是收集)?例如,您比更新用户,他的健康和保险记录更频繁地查询(如果1和3不是一个问题),那么这些数据最好应该包含在单个文档中,而不是从三个不同的来源查询。
此外,一个文档是Mongodb保证原子性的原因,如果您想同时更新用户,健康和保险(例如在一个API中),这将是一个额外的好处。
第3。文件大小
考虑一下:许多用户可以喜欢帖子而用户可以喜欢很多帖子(多对多)。并且由于您需要确保没有用户喜欢两次帖子,因此必须将用户ID存储在某处。三个可用选项:
如果超过一百万用户喜欢帖子,帖子文档将溢出用户引用。类似地,用户可以在短时间内喜欢数千个帖子,因此第二个选项也是不可行的。这给我们留下了第三个选项,这是本案的最佳选择。
但是帖子可以有很多评论,评论只属于一个帖子(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 considerations,modeling documents for retrieval和modeling relationships。尽管与Couchbase有关,但规则同样适用于mongodb模式设计,因为它们都是NoSql和面向文档的数据库。