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