我曾经使用MySQL,现在是Mongodb的新手。在学习阶段,我正在尝试创建像LinkedIn这样的用户个人资料。我很困惑,选择在mongodb模式中创建一对多关系的正确方法。
上下文:用户可以拥有多种教育资格,并且具有相同的经验。以下是两种方法,我尝试将模式创建为:
示例1 :
var userSchema = new mongoose.Schema({
name: {
first: String,
middle: String,
last: String,
},
gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
age: Number,
education: [{type: Schema.Types.ObjectId, ref:'Education'}],
experience: [{type: Schema.Types.ObjectId, ref:'Experience'}],
email: String
});
示例2 :
var userSchema = new mongoose.Schema({
name: {
first: String,
middle: String,
last: String,
},
gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
age: Number,
education: [{type: String, detail: {
major: String,
degree: String,
grade: String,
startdate: Date,
enddate: Date,
remarks: String
}}],
experience: [{type: String, detail: {
position: String,
company: String,
dateofjoin: String,
dateofretire: String,
location: String,
responsibilities: [{type:String}],
description: String,
}}],
email: String
});
我没有测试过第二个选项。
在编写查询以获取或添加数据时,哪一个更好更容易?是否有更好的方法为这样的场景编写模式?
答案 0 :(得分:1)
对于这个特定的例子,我建议将文档嵌入存储作为参考,这就是原因。
通常我在mongodb架构设计中的第一步是考虑如何查询数据?
我是否想知道用户的教育背景,或者我想知道具有特定教育背景的所有用户?获得这些类型问题的答案将决定您希望如何设置数据库。
如果您已经了解您的用户,则可以快速轻松地访问该文档中的嵌入式教育背景。不需要单独的查询,并且模式仍然过于复杂且难以理解。这就是我希望你想要访问数据的方式。
现在,如果要查找具有特定教育背景的所有用户,嵌入式文档架构显然存在很大缺陷。在这种情况下,您需要首先查看每个用户,然后遍历教育数组以查看所有各种教育。
所以答案将取决于您将对数据进行的预期查询,但在这种情况下(除非您正在对所有用户进行报告),那么嵌入式可能是最佳选择。
您可能还会发现此讨论很有用: