原文:6 Rules of Thumb for MongoDB Schema Design: Part 3
By William Zola, Lead Technical Support Engineer at MongoDB
這篇文章是系列的最后一篇败明。在第一篇文章里什猖,我介紹了三種針對(duì)“一對(duì)多?”關(guān)系建模的基礎(chǔ)方案。在第二篇文章中彰亥,我介紹了對(duì)基礎(chǔ)方案的擴(kuò)展:雙向關(guān)聯(lián)和反范式化。
反范式可以讓你避免一些應(yīng)用層級(jí)別的join衰齐,但是這也會(huì)讓更新變的更復(fù)雜任斋,開銷更大。不過冗余那些讀取頻率遠(yuǎn)遠(yuǎn)大于更新頻率的字段還是值得的耻涛。
如果你還沒有讀過前兩篇文章废酷,歡迎一覽。
讓我們回顧下這些方案
你可以采取內(nèi)嵌抹缕,或者建立one端或者N端的引用澈蟆,也可以三者兼而有之。
你可以在one端或者N端冗余多個(gè)字段
下面這些是你需要謹(jǐn)記的:
1卓研、優(yōu)先考慮內(nèi)嵌趴俘,除非有什么迫不得已的原因。
2奏赘、需要單獨(dú)訪問一個(gè)對(duì)象寥闪,那這個(gè)對(duì)象就不適合被內(nèi)嵌到其他對(duì)象中。
3磨淌、數(shù)組不應(yīng)該無限制增長(zhǎng)疲憋。如果many端有數(shù)百個(gè)文檔對(duì)象就不要去內(nèi)嵌他們可以采用引用ObjectID的方案;如果有數(shù)千個(gè)文檔對(duì)象梁只,那么就不要內(nèi)嵌ObjectID的數(shù)組缚柳。該采取哪些方案取決于數(shù)組的大小埃脏。
4、不要害怕應(yīng)用層級(jí)別的join:如果索引建的正確并且通過投影條件(第二章提及)限制返回的結(jié)果秋忙,那么應(yīng)用層級(jí)別的join并不會(huì)比關(guān)系數(shù)據(jù)庫(kù)中join開銷大多少彩掐。
5、在進(jìn)行反范式設(shè)計(jì)時(shí)請(qǐng)先確認(rèn)讀寫比灰追。一個(gè)幾乎不更改只是讀取的字段才適合冗余到其他對(duì)象中佩谷。
6、在mongodb中如何對(duì)你的數(shù)據(jù)建模监嗜,取決于你的應(yīng)用程序如何去訪問它們。數(shù)據(jù)的結(jié)構(gòu)要去適應(yīng)你的程序的讀寫場(chǎng)景抡谐。
設(shè)計(jì)指南
當(dāng)你在MongoDB中對(duì)“一對(duì)多”關(guān)系進(jìn)行建模裁奇,你有很多的方案可供選擇,所以你必須很謹(jǐn)慎的去考慮數(shù)據(jù)的結(jié)構(gòu)麦撵。下面這些問題是你必須認(rèn)真思考的:
關(guān)系中集合的規(guī)模有多大:是一對(duì)很少刽肠,很多,還是非常多免胃?
對(duì)于一對(duì)多中”多“的那一端音五,是否需要單獨(dú)的訪問它們,還是說它們只會(huì)在父對(duì)象的上下文中被訪問羔沙。
被冗余的字段的讀寫的比例是多少躺涝?
數(shù)據(jù)建模設(shè)計(jì)指南
在一對(duì)很少的情況下,你可以在父文檔中內(nèi)嵌數(shù)組扼雏。
在一對(duì)很多或者需要單獨(dú)訪問“N”端的數(shù)據(jù)時(shí)坚嗜,你可以采用數(shù)組引用ObjectID的方式。如果可以加速你的訪問也可以在“N”端使用父引用诗充。
在一對(duì)非常多的情況下苍蔬,可以在“N”端使用父引用。
如果你打算在你的設(shè)計(jì)中引入冗余等反范式設(shè)計(jì)蝴蜓,那么你必須確保那些冗余的數(shù)據(jù)讀取的頻率遠(yuǎn)遠(yuǎn)大于更新的頻率碟绑。而且你也不需要很強(qiáng)的一致性。因?yàn)榉捶妒交脑O(shè)計(jì)會(huì)讓你在更新冗余字段時(shí)付出一定的代價(jià)(更慢茎匠,非原子化)
相關(guān)文章:
MongoDB數(shù)據(jù)庫(kù)設(shè)計(jì)中6條重要的經(jīng)驗(yàn)法則格仲,part 1(每日一譯:2014-07-23)
MongoDB數(shù)據(jù)庫(kù)設(shè)計(jì)中6條重要的經(jīng)驗(yàn)法則,part 2(每日一譯:2014-07-24)