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

时间:2014-09-13 16:44:37

标签: mongodb mongoose nosql

第一次构建MongoDB数据库时,我遇到了一些数据库设计问题。

从我阅读本主题的所有内容中,当数据特定到此文档时,添加嵌入式文档是一种很好的做法。所以这是我目前的问题:

我有一个用户集合。每个用户都可能拥有地址。由于地址是特定于用户的,我会说这应该是我的用户收集器的嵌入式文档,对吗?

我还想存储角色(例如“用户”,“mod”,“admin”) - 因为我的项目中有很多不同的角色,角色也有 RoleType (例如“userType”)

如果我将这些类型的数据保存到我的用户集合中,它将导致:

  • 真的炸毁了用户集合(但是,因为我几乎总是做READ而不是WRITE操作,这可能不是太大的问题)
  • 没有很好的方法来保持数据结构的清洁(例如,所有角色== admin都不能拥有相同的对象ID)
SQL中的

我只是继续将表ROLE_TYPE和表ROLE与FK一起创建到ROLE_TYPE。在这种情况下,这可能是mongoDB的方式,还是我应该把所有内容都放到用户集合中?

1 个答案:

答案 0 :(得分:1)

你有正确的想法,即使看起来你膨胀你的用户架构,从长远来看它比拥有许多关系表更容易维护,这里是你的用户架构看起来如何的例子:

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的enum属性,该属性表示只允许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'},
})

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

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

希望有所帮助,如果您有任何其他问题,请告诉我。