gpt4 book ai didi

mongodb - 下面的多对多关系应该如何在 MongoDB 中建模?

转载 作者:可可西里 更新时间:2023-11-01 10:44:39 26 4
gpt4 key购买 nike

假设我有一个多对多关系的学生和老师。如果我只想找出给定学生的所有老师,反之亦然,我通常会使用嵌入式对象 ID 对其进行建模。例如,如果教师有一个属性 studentIds,它是一个学生对象 ID 数组,那么这些信息就足以执行您需要的所有查询。

但是假设学生可以给老师打分。这个评级应该如何适应模型?目前,我执行以下操作:

  1. 在 teacher 内部,我存储了一个 student 数组,而不是json 对象数组 {studentId: ObjectId, rating: String}
  2. 做查询的时候,我把json对象数组转换成数组studentIds 并像往常一样提取完整信息
  3. 所以现在我有一个学生对象数组和一个 json 对象数组收视率
  4. 但是,由于 MongoDB 中的 $in 运算符不保留顺序,我需要自己进行排序
  5. 在最后一步,一切就绪后,我可以将学生对象与评分结合起来得到我想要的

它有效,但似乎有点令人费解,有没有更好的方法?

最佳答案

这里有一些注意事项。最后,这取决于您的要求:

  1. 评级是可选的,对吗?

    如果是这样,请问问自己是否要将一项必需的功能(存储教师/学生关联)与一项不错的功能结合起来。实现可有可无功能的代码现在写入您最重要的集合。我认为您可以使用不同的数据库架构改善代码中的关注点分离

  2. 您需要更多功能吗?

    假设您想要为学生提供他们给出的评分列表、学生给教师的平均评分,并且您想要显示评分随时间的变化情况。这对于嵌入式文档来说会非常困惑。 嵌入式文档不太灵活

  3. 如果您需要顶级读取性能,则需要对更多数据进行反规范化

    如果您想坚持嵌入文档,您可能需要复制更多数据。假设有每位教师的评分概览,您可以在其中看到学生的姓名。嵌入对象会很有帮助

    { 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 查询,反之亦然。这是一个多查询,但它带来了巨大的灵 active 。

关于mongodb - 下面的多对多关系应该如何在 MongoDB 中建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923440/

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