這是系列的最后一部分。在第一部分里,我介紹了三種針對“一對多 ”關(guān)系建模的基礎(chǔ)方案。在第二部分中,我介紹了對基礎(chǔ)方案的擴展:雙向關(guān)聯(lián)和反范式化。 反范式可以讓你避免一些應(yīng)用層級別的join,但是這也會讓更新變的更復(fù)雜,開銷更大。不過冗余那些讀取
這是系列的最后一部分。在第一部分里,我介紹了三種針對“一對多 ”關(guān)系建模的基礎(chǔ)方案。在第二部分中,我介紹了對基礎(chǔ)方案的擴展:雙向關(guān)聯(lián)和反范式化。
反范式可以讓你避免一些應(yīng)用層級別的join,但是這也會讓更新變的更復(fù)雜,開銷更大。不過冗余那些讀取頻率遠遠大于更新頻率的字段還是值得的。
如果你還沒有讀過前兩部分,歡迎一覽。
讓我們回顧下這些方案
你可以采取內(nèi)嵌,或者建立one端或者N端的引用,也可以三者兼而有之。
你可以在one端或者N端冗余多個字段
下面這些是你需要謹記的:
1、優(yōu)先考慮內(nèi)嵌,除非有什么迫不得已的原因。
2、需要單獨訪問一個對象,那這個對象就不適合被內(nèi)嵌到其他對象中。
3、數(shù)組不應(yīng)該無限制增長。如果many端有數(shù)百個文檔對象就不要去內(nèi)嵌他們可以采用引用ObjectID的方案;如果有數(shù)千個文檔對象,那么就不要內(nèi)嵌ObjectID的數(shù)組。該采取哪些方案取決于數(shù)組的大小。
4、不要害怕應(yīng)用層級別的join:如果索引建的正確并且通過投影條件(第二部分提及)限制返回的結(jié)果,那么應(yīng)用層級別的join并不會比關(guān)系數(shù)據(jù)庫中join開銷大多少。
5、在進行反范式設(shè)計時請先確認讀寫比例。一個幾乎不更改只是讀取的字段才適合冗余到其他對象中。
6、在mongodb中如何對你的數(shù)據(jù)建模,取決于你的應(yīng)用程序如何去訪問它們。數(shù)據(jù)的結(jié)構(gòu)要去適應(yīng)你的程序的讀寫場景。
設(shè)計指南
當你在MongoDB中對“一對多”關(guān)系進行建模,你有很多的方案可供選擇,所以你必須很謹慎的去考慮數(shù)據(jù)的結(jié)構(gòu)。下面這些問題是你必須認真思考的:
關(guān)系中集合的規(guī)模有多大:是一對很少,很多,還是非常多?
對于一對多中”多“的那一端,是否需要單獨的訪問它們,還是說它們只會在父對象的上下文中被訪問。
被冗余的字段的讀寫的比例是多少?
數(shù)據(jù)建模設(shè)計指南
在一對很少的情況下,你可以在父文檔中內(nèi)嵌數(shù)組。
在一對很多或者需要單獨訪問“N”端的數(shù)據(jù)時,你可以采用數(shù)組引用ObjectID的方式。如果可以加速你的訪問也可以在“N”端使用父引用。
在一對非常多的情況下,可以在“N”端使用父引用。
如果你打算在你的設(shè)計中引入冗余等反范式設(shè)計,那么你必須確保那些冗余的數(shù)據(jù)讀取的頻率遠遠大于更新的頻率。而且你也不需要很強的一致性。因為反范式化的設(shè)計會讓你在更新冗余字段時付出一定的代價(更慢,非原子化)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com