2013-07-26 52 views
0

我玩最好的方式來建模mongodb文檔MongoDB實例vs關係denormalistion

我正在爲一所學校建模。

學生有很多科目。

Student{ 
    subjects:[ {name:'', 
       level:'', 
       short name:'' 
      }, 
      {...}, 
      {...}] 
} 

決定對學生進行非正常化和嵌入科目的表現。

在極少數情況下,當個體需要查詢和更新。

subjects.all 
subject1.short_name = 'something new' 

我知道我將不得不迭代通過每個學生來更新每個主題reocrd。

但是,最好的方式返回所有獨特的主題?

你能做例如student.subjects名稱的獨特的搜索?

或者是它最好有另一個集合這是

Subjects{ 
    name:'', 
    level:'', 
    short name:'' 
} 

我仍然保持了去歸一化Student.subject。但這只是爲了探索所有提供的主題。

的更新將更新此+每嵌入式Student.subject?

任何建議/建議?

+0

您無法查詢非常精通的非標準化數據庫中的所有內容。你的數據結構應該取決於哪些查詢對你很重要。首先列出你需要的所有查詢並在這裏添加。像這樣的多對多關係通常需要規範化的結構,但是您可以在幾個地方複製數據以使查詢更容易。 – Jayz

+0

@Jayz數據重複是數據庫編程的禍根,你肯定不想複製這個 – Sammaye

+0

@Sammaye,同意你的通用語句,但只適用於關係數據庫。在某些情況下,使用非關係數據庫是不可避免的,否則某些查詢可能需要很長時間才能執行。 – Jayz

回答

0

然而whast返回所有的唯一主題的最佳方式?

這是您的架構的短暫回落在這裏。你可以很容易地做出這種事情的能力,以換取其他更經常使用的速度優勢。

目前唯一真正的辦法是要麼使用distinct()命令(http://docs.mongodb.org/manual/reference/method/db.collection.distinct/):

db.students.distinct('subjects.name'); 

或聚合框架:

db.students.aggregate([ 
    {$unwind:'$subjects'}, 
    {$group:{_id:'$subjects.name'}} 
]) 

像現在這樣。

至於架構的建議,如果你打算做這種查詢經常那麼我會主題分解出到一個單獨的集合。