我很难为学校应用程序提供架构。
特别是,我试图模拟不同类型的用户(例如教师,助教和学生)与他们所属的课程和教程之间的关系。
以下是我的要求:
到目前为止,以下是我的用户,课程和教程集合的模式。
var CourseSchema = new mongoose.Schema({
name: { type: String, required: true },
code: { type: String, required: true },
tutorials: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tutorial' }], // 1
instructors: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], // 2
students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] // 3
});
var TutorialSchema = new mongoose.Schema({
number: { type: String, required: true },
teachingAsst: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] // 4
});
var UserSchema = new mongoose.Schema({
email: { type: String, lowercase: true },
password: String,
name: {
first: { type: String, lowercase: true },
last: { type: String, lowercase: true }
},
roles: [String] // instrutor, teachingAsst, student
};
问题在于我的要求5到8 - 从用户到其他模型的关系更是如此。什么是塑造这些关系的好方法?
一种方式,我想过这样做,例如req 5是向User schema
添加一个字段 instructor: {
courses: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }]
}
但问题发生在我做的时候,例如req 6.同样是因为它会使查询复杂化(例如“在用户是教学助理的课程中查找所有教程”)。
teachingAsst: {
courses: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }]
tutorials: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tutorial' }]
}
答案 0 :(得分:1)
在您的情况下,设计是多对多的关系。所以你有两种解决问题的方法。
嵌入式方法将具有重复数据,难以更新和删除,因为单个查询会使读取操作高效。
如果使用参考方法,您的数据将会士气低落。因此,更新和删除操作将很容易,因为读取操作将在数据库上有多个命中。
因此,根据您的申请要求,您必须决定适当的方法。