MongoDB數據庫設計原則
-
首先考慮集合的規模
-
一對很少
比如個人需要保存多個地址,個人關注的話題等。這種情況下使用內嵌文檔就很合適
-
一對很多
注意
很多
的定義: 數百到數千之間。這種情況先使用間接引用比較合適,即通過一個數組保存很多
一端的文檔id -
一對非常多
通過
父級引用
來解決,即非常多
的那端保存一
端的id -
總結
-
- 確定集合是否爲一對多,考慮
多
的一端是否需要一個單獨的實體
- 確定集合是否爲一對多,考慮
-
- 確定一對多的程度是
一對很少
,一對很多
還是一對非常多
一對很少
且不需要單獨訪問內嵌內容的情況下使用內嵌的方式一對很多
且很多
的那一端需要一個單獨的實體來描述時,使用數組的方式進行間接引用一對非常多
,使用父級引用
- 確定一對多的程度是
-
-
-
雙向關聯
可以讓
一
端和多
端同時保存對方的引用,但是如果對應關係發生了變化,那麼一
端和多
端就需要同時更新,這回更耗寫資源,也就無法保證操作的原子性。 -
反範式
-
反範式
Many -< One
將
many
端的部分信息冗餘到one
中,前提是這部分信息必須滿足讀的比例大於寫的比例。 -
反範式
One -< Many
冗餘
one
中的數據到many
中,同樣也應該考慮many
端關於該數據的讀寫比例。 -
總結
-
- 使用雙向引用的前提是需求可以接受無法原子更新的代價,這個代價就是比較耗時的寫操作。
-
- 採用冗餘數據的反範式設計時,需要考慮冗餘數據的讀寫比例,讀寫比高的數據才應該採取反範式話的設計。
-
-
-
總結
-
1、優先考慮內嵌,除非有什麼迫不得已的原因。
-
2、需要單獨訪問一個對象,那這個對象就不適合被內嵌到其他對象中。
-
3、數組不應該無限制增長。如果many端有數百個文檔對象就不要去內嵌他們可以採用引用ObjectID的方案;如果有數千個文檔對象,那麼就不要內嵌ObjectID的數組。該採取哪些方案取決於數組的大小。
-
4、在進行反範式設計時請先確認讀寫比。一個幾乎不更改只是讀取的字段才適合冗餘到其他對象中。
-
5、在mongodb中如何對你的數據建模,取決於你的應用程序如何去訪問它們。數據的結構要去適應你的程序的讀寫場景。
-