84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
想知道大家在做非關係型資料庫的專案時是如何進行設計的,以學生選課為例,每個學生可以選擇多個課程,每個課程可以讓多個學生選擇,這種多對多關係要如何設計,如果我要刪除一個課程,如何保證資料庫的一致性?
MongoDB 考慮兩種基本模式:文件和分錶。
文檔模式把一筆記錄記入一個文檔,以學生選課為例,就是在一個學生的文檔下記錄所有他選的課程;分錶模式就是像關係型資料庫那樣,學生和課程分開建表,然後再建一個學生和課程對應關係(選課)的表。
文件的主要優點是讀取效率高,MongoDB 沒有joint,如果分錶,每次查詢涉及幾張表就要做幾次查詢。文檔的主要缺點第一就是維護不便,例如你修改了一個課程的信息,就得找到所有包含這個課程的學生文檔,然後逐個修改。另外一個文檔的大小是有限制的,不能無限增加資料。
joint
分錶的優缺點和文檔式相反。
實務中要權衡選擇,以讀取為主的資料傾向於選擇文檔模式,寫/修改頻率高的資料可以考慮分錶。另外對於可能無限增加資料的字段,通常也要考慮分錶存儲。
一般是二者結合起來用,在文檔中記錄讀取頻率較高的信息,其它細節信息單獨建表。到你這個例子裡,就是學生和課程建兩個表,每個學生文件下記錄選課的基礎資訊(例如課程代碼和名稱),然後每個課程的具體資訊儲存在課程表裡。
當你每次列出一個學生的選課資訊時,一次查詢就可以列出所有選課的代碼和名稱,當需要查看具體一門課程的詳細信息時再對課程表做一次查詢。這樣比完全分錶可以減少一次查詢,比完全文檔記錄減少了文檔的大小和修改課程資訊時要修改的範圍。
如果你要刪除一門課,先在課表裡刪除這門課的文檔,然後在學生表裡找到所有包含這門課的記錄然後修改之。靈活運用索引和操作符,並不是問題。
MongoDB 考慮兩種基本模式:文件和分錶。
文檔模式把一筆記錄記入一個文檔,以學生選課為例,就是在一個學生的文檔下記錄所有他選的課程;分錶模式就是像關係型資料庫那樣,學生和課程分開建表,然後再建一個學生和課程對應關係(選課)的表。
文件的主要優點是讀取效率高,MongoDB 沒有
joint
,如果分錶,每次查詢涉及幾張表就要做幾次查詢。文檔的主要缺點第一就是維護不便,例如你修改了一個課程的信息,就得找到所有包含這個課程的學生文檔,然後逐個修改。另外一個文檔的大小是有限制的,不能無限增加資料。分錶的優缺點和文檔式相反。
實務中要權衡選擇,以讀取為主的資料傾向於選擇文檔模式,寫/修改頻率高的資料可以考慮分錶。另外對於可能無限增加資料的字段,通常也要考慮分錶存儲。
一般是二者結合起來用,在文檔中記錄讀取頻率較高的信息,其它細節信息單獨建表。到你這個例子裡,就是學生和課程建兩個表,每個學生文件下記錄選課的基礎資訊(例如課程代碼和名稱),然後每個課程的具體資訊儲存在課程表裡。
當你每次列出一個學生的選課資訊時,一次查詢就可以列出所有選課的代碼和名稱,當需要查看具體一門課程的詳細信息時再對課程表做一次查詢。這樣比完全分錶可以減少一次查詢,比完全文檔記錄減少了文檔的大小和修改課程資訊時要修改的範圍。
如果你要刪除一門課,先在課表裡刪除這門課的文檔,然後在學生表裡找到所有包含這門課的記錄然後修改之。靈活運用索引和操作符,並不是問題。