gpt4 book ai didi

多种用户类型的 MongoDB 模式设计

转载 作者:行者123 更新时间:2023-12-04 11:15:37 27 4
gpt4 key购买 nike

我要建一个 Node.js+Express+Mongoose 应用程序,我想挑选社区的大脑并获得一些关于最佳实践的建议,并着手创建有效的架构设计。

我的申请将包括 2 种不同的用户类型 ,即“老师”和“学生”。每个人都有一个用户配置文件,但需要 每个帐户类型的不同字段 . “老师”和“学生”之间也存在关系,其中“学生”最初会有 1位老师 (以后有更多的可能),一个“老师”就有很多学生 .

关于如何解决这个问题,我最初的想法是为每个用户类型创建一个通用的 User 模型和一个配置文件模型(studentProfile 模型和教师配置文件模型),然后在 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
});

或者我直接将两个配置文件的所有字段直接嵌入 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 的字段所需的属性。但是我不应该首先依赖 Mongoose 进行验证并让我的应用程序逻辑进行验证吗?

最重要的是,还将有一个单独的集合/模型用于记录学生的事件和任务,为每个记录的任务引用学生的 ID,即:
var activitySchema = new Schema({
activity: String,
date: Date,
complete: Boolean,
student_id: ObjectID
});

我在数据库设计的正确轨道上吗?任何反馈都将不胜感激,因为我重视来自这个社区的任何意见,并且一直在寻求学习和提高我的技能。有什么比来自志同道合的人和该领域的专家更好的方法了:)

此外,您可以看到我正在利用 Mongoose 的人口特征。有什么理由不建议这样做吗?

再次感谢!

最佳答案

您可以尝试使用 .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
检查文档。

关于多种用户类型的 MongoDB 模式设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404110/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com