在MongoDB University
學習更多關於MongoDB的知識和技能程序員
如今到了咱們總結使用模式構建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題,並着重複習每一個模式所具備的一些好處以及作出的權衡。關於模式設計,最多見的問題是「我正在設計一個要作某某事情的應用程序,如何對數據建模?」正如咱們但願你在學習本系列過程當中能夠體會到的那樣,要回答這個問題,須要考慮不少事情。不過咱們提供了一個應用場景示例圖,這至少有助於爲通用的數據建模提供一些初級的指導。數據庫
應用場景示例設計模式
下圖是咱們在與客戶合做多年後發現的用於各類應用程序中設計模式的指導原則。對於哪一種設計模式能夠用於某類特定的應用程序不是「一成不變」的。你須要仔細查看用例中常用的那些,可是不要忽略其它的,它們可能仍然適用。如何設計應用程序的數據模式很是依賴於數據訪問的方式。分佈式
設計模式總結工具
近似值性能
近似值模式適用於當昂貴的計算很頻繁,而這些計算的精度要求一般不是首要考慮的時候。學習
優勢
• 對數據庫更少的寫入
• 保持在統計學上有效的數字
缺點
• 沒法展現精確的數字
• 須要在應用層實現優化
屬性設計
屬性模式適用於解決這樣一類問題:咱們有一些大文檔,它們有不少類似的字段,而這些字段的一個子集具備共同的特徵,咱們但願對該子集字段進行排序或查詢。當須要排序的字段只能在一小部分文檔中找到。或者在文檔中同時知足這兩個條件時。3d
優勢
• 須要更少的索引
• 查詢變得更容易編寫,並且一般更快
分桶
當須要管理流式數據,如時間序列、實時分析或物聯網(IOT)應用程序時,分桶模式是一個很好的解決方案。
優勢
• 減小了集合中的文檔總數
• 提升了索引性能
• 能夠經過預聚合簡化數據的訪問
計算
當數據訪問模式爲讀取密集型而且應用程序須要重複計算這些數據時,計算模式是一個很好的選項。
優勢
• 對於頻繁的計算能夠減小CPU的工做負載
• 查詢變得更容易編寫,並且一般更快
缺點
• 識別出須要使用此模式的的場景可能比較困難
• 除非必要,請勿過分使用此模式
文檔版本控制
當你須要在MongoDB中維護之前版本的文檔時,文檔版本控制模式是一種可行的解決方案。
優勢
• 容易實現,即便是在現存的系統中
• 在最新版本上進行請求時,沒有性能上的影響
缺點
• 寫操做的數量會翻倍
• 請求須要被定位到正確的集合
擴展引用
當你的應用程序使用了大量的JOIN操做來將頻繁訪問的數據集中在一塊兒時,你會發現擴展引用模式很是有用。
優勢
• 當有大量的JOIN操做時能夠提高性能
• 讀操做會更快,而且能夠減小JOIN操做的數量
缺點
• 會有重複數據
異常值
你是否發現有一些查詢或文檔和其它典型數據的模式不同?這些例外狀況是否驅動了你應用程序的解決方案?若是是這樣,那麼異常值模式就是解決這種狀況的一個很好的方法。
優勢
• 防止整個應用的解決方案被某些個別的文檔或請求所左右
• 請求會針對那些典型的用例進行優化,而異常值仍將獲得處理
缺點
• 一般會爲特定的查詢而進行定製,所以一些臨時產生的查詢可能性能不太理想
• 此模式的大部分工做是在應用程序代碼中完成的
預分配
當你事先知道文檔的結構,而應用程序只須要用數據填充它時,預分配模式是正確的選擇。
優勢
• 當預先知道文檔結構時,能夠簡化設計
缺點
• 簡單和性能之間的權衡
多態
當有多種文檔它們的類似性比差別更多,而且須要將這些文檔保存在同一個集合中時,多態模式是一種解決方案。
優勢
• 實現簡單
• 查詢能夠在單個集合中運行
模式版本控制
幾乎每一個應用程序均可以從模式版本控制模式中獲益,由於數據模式的更改常常發生在應用程序的生命週期中。此模式容許歷史版本和當前版本的文檔在集合中同時存在。
優勢
• 不須要停機時間
• 模式遷移可控
• 減小將來的技術債務
缺點
• 在遷移過程當中,對相同的字段可能須要兩個索引
子集
子集模式解決了有大量數據的大文檔沒有被應用程序使用而致使的工做集超過RAM容量的問題。
優勢
• 在整體上減少了工做集的大小
• 縮短了最經常使用數據的磁盤訪問時間
缺點
• 必須管理子集
• 請求附加的數據須要額外的數據庫訪問
樹形
當數據是分層結構而且常常被查詢時,樹形模式就是你要使用的。
優勢
• 經過避免屢次JOIN操做提升了性能
缺點
• 須要在應用層管理圖的更新
結論
正如咱們但願你在本系列文章中看到的,MongoDB文檔模型在如何建模數據方面提供了很大的靈活性。這種靈活性是很是強大的,可是這種能力須要根據應用程序的數據訪問模式去駕馭利用。MongoDB中的模式設計對應用程序的性能有着巨大的影響。咱們發現性能問題經常能夠追溯到糟糕的模式設計。
請記住,爲了進一步加強文檔模型的能力,這些設計模式在合理的狀況下能夠一塊兒使用。例如,隨着應用程序的發展,模式版本控制能夠與任何其它模式一塊兒使用。學習完已經介紹的十二種設計模式,你已經擁有了利用文檔模型強大的靈活性所需的工具和知識。
精彩內容
譯者:牟天壘
野生程序員一枚。
長期關注分佈式系統及通用型數據庫技術。