假设我有多对多的学生和老师。如果我只是想找出给定学生的所有教师,反之亦然,我通常使用嵌入式对象ID对其进行建模。例如,如果教师有一个属性studentIds,它是一个学生对象ID数组,那么这就足以完成所需的所有查询。
但是假设学生可以给老师一个评级。该评级应该如何适应模型?目前我做了以下事情:
它有效,但似乎有点复杂有没有更好的方法来做到这一点?
答案 0 :(得分:1)
以下是一些注意事项。最后,这取决于您的要求:
评级是可选的,对吧?
如果是这样,请问自己是否要将所需的功能(存储教师/学生协会)与可爱的功能相结合。实现一个很好的功能的代码现在写入您最重要的集合。我认为您可以使用不同的数据库架构改进代码中的关注点分离。
您需要更多功能吗?
假设您希望为学生提供他们给出的评分列表,学生给予教师的平均评分,以及您希望随着时间的推移显示评分的发展。嵌入式文档会非常混乱。 嵌入式文档不太灵活。
如果您需要最佳读取性能,则需要对更多数据进行非规范化
如果您想坚持使用嵌入式文档,则可能需要复制更多数据。让我们说每个教师的评分概述,你可以看到学生的名字。嵌入对象
会很有帮助{ studentId : ObjectId,
rating: string,
studentName: string,
created: dateTime }
作为替代方案,请考虑
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
教师/学生协会仍将存储在教师对象中,但评分属于不同的集合。如果找不到教师和学生之间的关联,则无法创建评级。
或
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
要查找给定教师的所有学生,您必须先查询链接器文档,然后对学生进行$in
查询,反之亦然。这是另一个问题,但它带来了巨大的灵活性。