2012-06-06 88 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查詢,反之亦然。這是另外一個問題,但它帶來了靈活性方面的巨大收益。