MongoDB建模嵌入式文档正确的方式

问题描述:

第一次构建MongoDB数据库时,我遇到了一些数据库设计问题。MongoDB建模嵌入式文档正确的方式

从我在这个主题上阅读的所有内容来看,当数据为特定时,添加嵌入式文档是一个很好的习惯。所以这里是我目前的问题:

我有一个用户收集。每个用户可能有一个地址。由于地址是特定于用户的,因此我认为这应该是我的用户收集器的嵌入式文档,对吧?

我也想存储角色(例如,“用户”,“国防部”,“管理员”) - 因为我有我的项目很多不同的角色,一个角色也有角色类型(如“USERTYPE “)

如果我想这些类型的数据保存到我的用户采集以及它会导致成:

  • 真的炸掉用户采集(但是,因为我几乎总是这样读,而不是写操作这可能不是太大的问题)
  • 没有好的方法来保持数据结构的清洁(例如,所有角色==管理员不能有相同的对象ID)

在SQL我只是继续前进并创建一个表ROLE_TYPE和表ROLE与FK ROLE_TYPE。在这种情况下,对于mongoDB来说,这可能还是应该如此,否则我是否应该将所有内容都放入用户集合中?

你有正确的想法,即使它看起来像你腹胀您的用户架构它是不是具有一对多的关系表从长远来看,更容易维护,这里有一个例子您的用户架构可能的样子:

var ROLES = ['user', 'mod', 'admin']; 
var UserSchema = new Schema({ 
    email: {type: String}, 
    address: { 
     address: {type: String}, 
     city: {type: String}, 
     zipCode: {type: Number}, 
     country: {type: String}, 
    }, 
    role: {type: String, enum: ROLES}, 
}) 

在这里你可以看到我嵌入地址字段作为嵌套文档。我也使用了Mongoose的枚举属性,它说只有ROLES数组中的角色是允许的。如果您尝试保存不在列表中的角色,它将返回一个错误。

但是,如果你的意思是,每个角色也应该有一个类型的我肯定会提出这个到一个单独的模式是这样的:

var ROLES = ['user', 'mod', 'admin']; 
var RoleSchema = new Schema({ 
    name: {type: String, enum: ROLES}, 
    type: {type: String}, 
}); 

并将其链接到您的UserSchema:

var UserSchema = new Schema({ 
    ... 
    role: {type: Schema.Types.ObjectId, ref: 'Role'}, 
}) 

现在,当您保存新用户时,您需要找到相应的角色对象并将该对象的ID保存到用户,这里是一个示例:

Role.findOne({name: 'user', type: 'userType'}, function(err, role) { 
    var user = new User({ 
     email: '[email protected]', 
     address: { 
      address: '500 Wall St', 
      city: 'Seattle', 
      zipCode: 98121, 
      country: 'USA', 
     }, 
     role: role._id, 
    }) 
}) 

希望帮助,让我知道如果你有任何其他问题。

+0

非常感谢您的解释。我想我会像在你的例子中那样创建RoleSchema。 – Markus 2014-09-13 18:00:36