2012-06-06 45 views
2

假设我的学生和老师处于多对多的关系。如果我只想找出给定学生的所有教师,反之亦然,我通常使用嵌入式对象ID对其进行建模。例如,如果教师拥有属性studentIds,该属性是学生对象ID的数组,那么这是足够的信息来完成所有您需要的查询。在MongoDB中应该如何模拟以下多对多关系?

但是,假设学生可以给老师一个评分。该评分应该如何与模型吻合?此刻,我做到以下几点:

  1. 里面的老师,而不是存储学生的阵列,我存储的 阵列JSON对象{studentId:物件,等级:字符串}
  2. 当进行查询,我JSON对象的数组转换成studentIds数组 并提取全部信息像往常一样
  3. 所以现在我有学生对象的数组和JSON对象与 数组的收视率
  4. 然而,由于在$ MongoDB中的运算符不保留排序,我需要做我的ow n的为了我能结合学生的排序
  5. 在最后一步,一切以收视率 对象来得到我想要

它的工作原理,但似乎有点令人费解的是有这样做的更好的办法?

+0

似乎对我来说很合理.... –

回答

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

相关问题