MongoDB數據庫設計中6條重要的經驗法則,part 3(每日一譯:2014-07-25)

原文:6 Rules of Thumb for MongoDB Schema Design: Part 3

By William Zola, Lead Technical Support Engineer at MongoDB

這篇文章是系列的最后一篇。在第一篇文章里,我介紹了三種針對“一對多?”關系建模的基礎方案。在第二篇文章中,我介紹了對基礎方案的擴展:雙向關聯和反范式化。

反范式可以讓你避免一些應用層級別的join,但是這也會讓更新變的更復雜,開銷更大。不過冗余那些讀取頻率遠遠大于更新頻率的字段還是值得的。

如果你還沒有讀過前兩篇文章,歡迎一覽。

讓我們回顧下這些方案

你可以采取內嵌,或者建立one端或者N端的引用,也可以三者兼而有之。

你可以在one端或者N端冗余多個字段

下面這些是你需要謹記的:

1、優先考慮內嵌,除非有什么迫不得已的原因。

2、需要單獨訪問一個對象,那這個對象就不適合被內嵌到其他對象中。

3、數組不應該無限制增長。如果many端有數百個文檔對象就不要去內嵌他們可以采用引用ObjectID的方案;如果有數千個文檔對象,那么就不要內嵌ObjectID的數組。該采取哪些方案取決于數組的大小。

4、不要害怕應用層級別的join:如果索引建的正確并且通過投影條件(第二章提及)限制返回的結果,那么應用層級別的join并不會比關系數據庫中join開銷大多少。

5、在進行反范式設計時請先確認讀寫比。一個幾乎不更改只是讀取的字段才適合冗余到其他對象中。

6、在mongodb中如何對你的數據建模,取決于你的應用程序如何去訪問它們。數據的結構要去適應你的程序的讀寫場景。

設計指南

當你在MongoDB中對“一對多”關系進行建模,你有很多的方案可供選擇,所以你必須很謹慎的去考慮數據的結構。下面這些問題是你必須認真思考的:

關系中集合的規模有多大:是一對很少,很多,還是非常多?

對于一對多中”多“的那一端,是否需要單獨的訪問它們,還是說它們只會在父對象的上下文中被訪問。

被冗余的字段的讀寫的比例是多少?

數據建模設計指南

在一對很少的情況下,你可以在父文檔中內嵌數組。

在一對很多或者需要單獨訪問“N”端的數據時,你可以采用數組引用ObjectID的方式。如果可以加速你的訪問也可以在“N”端使用父引用。

在一對非常多的情況下,可以在“N”端使用父引用。

如果你打算在你的設計中引入冗余等反范式設計,那么你必須確保那些冗余的數據讀取的頻率遠遠大于更新的頻率。而且你也不需要很強的一致性。因為反范式化的設計會讓你在更新冗余字段時付出一定的代價(更慢,非原子化)

相關文章:

MongoDB數據庫設計中6條重要的經驗法則,part 1(每日一譯:2014-07-23)

MongoDB數據庫設計中6條重要的經驗法則,part 2(每日一譯:2014-07-24)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容