摘要:在學習更多關于的知識和技能現在到了我們總結使用模式構建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題,并著重復習每個模式所具有的一些好處以及做出的權衡。長期關注分布式系統及通用型數據庫技術。
在MongoDB University
學習更多關于MongoDB的知識和技能
現在到了我們總結使用模式構建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題,并著重復習每個模式所具有的一些好處以及做出的權衡。關于模式設計,最常見的問題是“我正在設計一個要做某某事情的應用程序,如何對數據建模?”正如我們希望你在學習本系列過程中可以體會到的那樣,要回答這個問題,需要考慮很多事情。不過我們提供了一個應用場景示例圖,這至少有助于為通用的數據建模提供一些初級的指導。
應用場景示例
下圖是我們在與客戶合作多年后發現的用于各種應用程序中設計模式的指導原則。對于哪種設計模式可以用于某類特定的應用程序不是“一成不變”的。你需要仔細查看用例中經常使用的那些,但是不要忽略其它的,它們可能仍然適用。如何設計應用程序的數據模式非常依賴于數據訪問的方式。
設計模式總結
近似值
近似值模式適用于當昂貴的計算很頻繁,而這些計算的精度要求通常不是首要考慮的時候。
優點
? 對數據庫更少的寫入
? 保持在統計學上有效的數字
缺點
? 無法展示精確的數字
? 需要在應用層實現
屬性
屬性模式適用于解決這樣一類問題:我們有一些大文檔,它們有很多相似的字段,而這些字段的一個子集具有共同的特征,我們希望對該子集字段進行排序或查詢。當需要排序的字段只能在一小部分文檔中找到。或者在文檔中同時滿足這兩個條件時。
優點
? 需要更少的索引
? 查詢變得更容易編寫,而且通常更快
分桶
當需要管理流式數據,如時間序列、實時分析或物聯網(IOT)應用程序時,分桶模式是一個很好的解決方案。
優點
? 減少了集合中的文檔總數
? 提高了索引性能
? 可以通過預聚合簡化數據的訪問
計算
當數據訪問模式為讀取密集型并且應用程序需要重復計算這些數據時,計算模式是一個很好的選項。
優點
? 對于頻繁的計算可以減少CPU的工作負載
? 查詢變得更容易編寫,而且通常更快
缺點
? 識別出需要使用此模式的的場景可能比較困難
? 除非必要,請勿過度使用此模式
文檔版本控制
當你需要在MongoDB中維護以前版本的文檔時,文檔版本控制模式是一種可行的解決方案。
優點
? 容易實現,即使是在現存的系統中
? 在最新版本上進行請求時,沒有性能上的影響
缺點
? 寫操作的數量會翻倍
? 請求需要被定位到正確的集合
擴展引用
當你的應用程序使用了大量的JOIN操作來將頻繁訪問的數據集中在一起時,你會發現擴展引用模式非常有用。
優點
? 當有大量的JOIN操作時可以提升性能
? 讀操作會更快,并且可以減少JOIN操作的數量
缺點
? 會有重復數據
異常值
你是否發現有一些查詢或文檔和其它典型數據的模式不一樣?這些例外情況是否驅動了你應用程序的解決方案?如果是這樣,那么異常值模式就是解決這種情況的一個很好的方法。
優點
? 防止整個應用的解決方案被某些個別的文檔或請求所左右
? 請求會針對那些典型的用例進行優化,而異常值仍將得到處理
缺點
? 通常會為特定的查詢而進行定制,因此一些臨時產生的查詢可能性能不太理想
? 此模式的大部分工作是在應用程序代碼中完成的
預分配
當你事先知道文檔的結構,而應用程序只需要用數據填充它時,預分配模式是正確的選擇。
優點
? 當預先知道文檔結構時,可以簡化設計
缺點
? 簡單和性能之間的權衡
多態
當有多種文檔它們的相似性比差異更多,并且需要將這些文檔保存在同一個集合中時,多態模式是一種解決方案。
優點
? 實現簡單
? 查詢可以在單個集合中運行
模式版本控制
幾乎每個應用程序都可以從模式版本控制模式中獲益,因為數據模式的更改經常發生在應用程序的生命周期中。此模式允許歷史版本和當前版本的文檔在集合中同時存在。
優點
? 不需要停機時間
? 模式遷移可控
? 減少未來的技術債務
缺點
? 在遷移過程中,對相同的字段可能需要兩個索引
子集
子集模式解決了有大量數據的大文檔沒有被應用程序使用而導致的工作集超過RAM容量的問題。
優點
? 在總體上減小了工作集的大小
? 縮短了最常用數據的磁盤訪問時間
缺點
? 必須管理子集
? 請求附加的數據需要額外的數據庫訪問
樹形
當數據是分層結構并且經常被查詢時,樹形模式就是你要使用的。
優點
? 通過避免多次JOIN操作提高了性能
缺點
? 需要在應用層管理圖的更新
結論
正如我們希望你在本系列文章中看到的,MongoDB文檔模型在如何建模數據方面提供了很大的靈活性。這種靈活性是非常強大的,但是這種能力需要根據應用程序的數據訪問模式去駕馭利用。MongoDB中的模式設計對應用程序的性能有著巨大的影響。我們發現性能問題常常可以追溯到糟糕的模式設計。
請記住,為了進一步增強文檔模型的能力,這些設計模式在合理的情況下可以一起使用。例如,隨著應用程序的發展,模式版本控制可以與任何其它模式一起使用。學習完已經介紹的十二種設計模式,你已經擁有了利用文檔模型強大的靈活性所需的工具和知識。
精彩內容
利用模式進行構建第一講——多態模式
利用模式進行構建第二講——屬性模式
利用模式進行構建第三講——桶模式
利用模式進行構建第四講——異常值模式
利用模式進行構建第五講——計算模式
利用模式進行構建第六講——子集模式
利用模式進行構建第七講——擴展引用模式
利用模式進行構建第八講——近似值模式
利用模式進行構建第九講——樹形模式
利用模式進行構建第十講——預分配模式
利用模式進行構建第十一講——文檔版本控制模式
譯者:牟天壘
野生程序員一枚。
長期關注分布式系統及通用型數據庫技術。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19558.html
摘要:延伸閱讀學習與實踐資料索引與前端工程化實踐前端每周清單半年盤點之篇前端每周清單半年盤點之與篇前端每周清單半年盤點之篇 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關注【前端之巔】微信公眾號(ID:frontshow),及時獲取前端每周清單;本文則是對于半年來發布的前端每周清單...
摘要:優點建造者模式的封裝性很好,對象本身與構建過程解耦。建造者模式很容易進行擴展。適用場景需要生成的對象具有復雜得內部結構且內部屬性本身相互依賴建造者模式的代碼實現建造者模式主要有個部分產品類建造者類指揮者類客戶。建造者完成相應的部分。 建造者模式 建造者模式(builder pattern)比較簡單,它屬于創建型模式的一種,將一個復雜的對象分解成多個簡單的對象來進行構建,將復雜的構建層與...
摘要:本質建造者設計模式分離了對象子組件的構造過程和組裝過程,實現了構建與組裝的解耦,不同的構建器相同的組裝順序以及相同的構建器不同的組裝順序都可以創建出不同的對象,使得構建與組裝充分解耦,進而實現構建算法與組裝算法的解耦,從而實現更好的復用。 這是設計模式系列的第二篇——建造者設計模式,我希望推送的文章是一個系列的,盡量保持一樣的寫作風格,盡量把我理解的闡述清楚,關于建造者設計模式主要從以...
摘要:前端每周清單半年盤點之與篇前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。與求同存異近日,宣布將的構建工具由遷移到,引發了很多開發者的討論。 前端每周清單半年盤點之 React 與 ReactNative 篇 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為...
閱讀 3935·2021-11-16 11:50
閱讀 934·2021-11-11 16:55
閱讀 3662·2021-10-26 09:51
閱讀 866·2021-09-22 15:03
閱讀 3421·2019-08-30 15:54
閱讀 3265·2019-08-30 15:54
閱讀 2476·2019-08-30 14:04
閱讀 922·2019-08-30 13:53