针对多种用户类型的MongoDB架构设计

时间:2016-05-24 03:55:41

标签: mongodb database-design database-schema

我即将构建一个 Node.js + Express + Mongoose 应用程序,我想选择社区的大脑并获得有关最佳实践的建议并开始创建有效的架构设计

我的申请将包括 2种不同的用户类型,即“老师”和“学生”。每个都有一个用户个人资料,但每个帐户类型需要不同的字段。 “老师”和“学生”之间也会有关系,其中“学生”最初会有<1名教师(未来可能会有更多),而“老师”会很多学生

我对如何处理此问题的初步想法是为每个用户类型创建一个通用用户模型和配置文件模型( studentProfile 模型&amp; teacherProfile < / em> model),然后在 User 模型中引用相应的配置文件模型,如下所示(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 
});

或者我是否继续直接在用户模型中嵌入两个配置文件的所有字段,只填充特定用户类型所需的字段,如下所示(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的必需属性。但是,我是否应该首先依靠Mongoose进行验证并让我的应用程序逻辑进行验证?

除此之外,还将有一个单独的集合/模型用于记录学生的活动和任务,参考每个记录任务的学生ID,即:

var activitySchema = new Schema({
    activity: String,
    date: Date,
    complete: Boolean,
    student_id: ObjectID
});

我是否在数据库设计的正确轨道上?任何反馈将非常感激,因为我重视来自这个社区的任何意见,并且我总是希望学习和提高我的技能。有什么比志同道合的人和该领域的专家更好的方式:)

另外,你可以看到我正在利用Mongoose的人口特征。有什么理由反对这个吗?

再次感谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试使用 .discriminator({...}) 函数来构建用户架构,以便其他架构可以直接“继承”属性。

const options = {discriminatorKey: 'kind'};

const UserSchema = new Schema({
    name: String,
    email: String,
    password: String,
    /* role: String, Student or Teacher <-- NO NEED FOR THIS. */
    profile: { type: ObjectID, refPath: 'role' }
}, options);

const Student = User.discriminator('Student', new Schema({
    age: Number,
    grade: Number,
    teachers: [{ type: ObjectID, ref: 'Teacher' }]
}, options));

const Teacher = User.discriminator('Teacher', new Schema({
    school: String,
    subject: String
}, options));

const student = new Student({
    name: "John Appleseed",
    email: "john@gmail.com",
    password: "123",
    age: 18,
    grade: 12,
    teachers: [...]
});

console.log(student.kind) // Student

检查文档。