我即将构建一个 Node.js+Express+Mongoose 应用程序,希望能够借助社区的智慧并获得有关最佳实践和创建高效架构设计的建议。
我的应用程序将包括 2 种不同类型的用户,即“教师”和“学生”。每个用户都将拥有一个用户资料,但是需要为每种帐户类型提供不同的字段。此外,“教师”和“学生”之间还会存在关系,其中“学生”最初将拥有1 名教师(未来可能还会有更多),而“教师”将拥有多名学生。
我对如何处理这个问题的最初想法是创建一个通用的用户模型以及每个用户类型的资料模型(studentProfile 模型和 teacherProfile 模型),然后在用户模型中引用相应的资料模型,如下所示 (A):
var UserSchema = new Schema({
name: String,
email: String,
password: String,
role: String, /* Student or Teacher */
profile: { type: ObjectID, refPath: 'role' }
});
var studentProfileSchema = new Schema({
age: Number,
grade: Number,
teachers: [{ type: ObjectID, ref: 'Teacher' }]
});
var teacherProfileSchema = new Schema({
school: String,
subject: String
});
还是直接在User模型中嵌入两个档案的所有字段,并仅填充特定用户类型所需的字段,像这样(B):
var UserSchema = new Schema({
name: String,
email: String,
password: String,
role: String, /* Student or Teacher */
profile: {
age: Number,
grade: Number,
school: String,
subject: String
},
relationships: [{ type: ObjectID, ref: 'User' }]
});
选项B的缺点是我不能真正利用Mongoose的required属性来设置字段。但是,我是否不应该首先依赖Mongoose进行验证,而是让我的应用程序逻辑进行验证呢?
此外,还将有一个单独的集合/模型用于记录学生的活动和任务,引用每个记录任务的学生ID,即:
var activitySchema = new Schema({
activity: String,
date: Date,
complete: Boolean,
student_id: ObjectID
});
我的数据库设计是否正确?非常感谢社区提供的任何意见,我非常重视这些意见,并始终希望学习和提高自己的技能。从志同道合的人和行业专家那里学习还有什么比这更好的呢?
另外,您可以看到我正在利用Mongoose的population功能。有没有理由反对这样做呢?
再次感谢!