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