以下这个多对多关系在MongoDB中应该如何建模?

3
假设我有学生和教师之间的多对多关系。如果我只想查找给定学生的所有老师或反之,则通常使用嵌入式对象ID进行建模。例如,如果老师有一个属性studentIds,它是一个学生对象ID的数组,那么这就足够了,可以执行您需要的所有查询。
然而,假设学生可以为老师评分。这个评分应该如何适应模型?目前我这样做:
1. 在教师内部,不存储学生的数组,而是存储json对象的数组{studentId: ObjectId,rating: String} 2. 在进行查询时,将json对象数组转换为studentIds数组,并像往常一样提取完整信息 3. 现在我有一个学生对象数组和一个带有评分的json对象数组 4. 但是,由于MongoDB中的$in运算符不保留排序,因此我需要自己进行排序 5. 在最后一步,将所有内容按顺序组合起来,以获得所需的结果
这样做起来虽然可行,但似乎有些复杂。是否有更好的方法呢?
1个回答

1

以下是一些需要考虑的因素。最终,这取决于您的要求:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接