第一次构建MongoDB数据库时,我遇到了一些数据库设计问题。
从我阅读本主题的所有内容中,当数据特定到此文档时,添加嵌入式文档是一种很好的做法。所以这是我目前的问题:
我有一个用户集合。每个用户都可能拥有地址。由于地址是特定于用户的,我会说这应该是我的用户收集器的嵌入式文档,对吗?
我还想存储角色(例如“用户”,“mod”,“admin”) - 因为我的项目中有很多不同的角色,角色也有 RoleType (例如“userType”)
如果我将这些类型的数据保存到我的用户集合中,它将导致:
我只是继续将表ROLE_TYPE和表ROLE与FK一起创建到ROLE_TYPE。在这种情况下,这可能是mongoDB的方式,还是我应该把所有内容都放到用户集合中?
答案 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,
})
})
希望有所帮助,如果您有任何其他问题,请告诉我。