天天看點

MongoDB入門實戰教程(8)

MongoDB入門實戰教程(8)

前面我們學習了模型設計中的内嵌模式與引用模式的使用,本篇我們來看看在模型設計中如何套用常見的設計模式來降低設計難度,提高查詢效率。本文簡單介紹了MongoDB的模型設計中的三大類常用設計模式:表現形式類、資料通路類 和 組織結構類。通過學習這些設計模式,使我們可以在模型設計場景中恰當地套用這些設計模式,進而達到提升資料讀寫效率 和 降低資源的需求,最終得到一個合适的文檔模型。

前面我們學習了模型設計中的内嵌模式與引用模式的使用,本篇我們來看看在模型設計中如何套用常見的設計模式來降低設計難度,提高查詢效率。

1 MongoDB也有設計模式?

在使用C#/Java等開發語言的時候,我們通常會學習面向對象和設計模式來提高設計水準,使得開發的應用程式具有較高的可擴充性 和 可讀性。

在MongoDB的模型設計中,我們都了解到文檔模型是一個無範式和無思維定式的模型,那麼,有沒有一些設計的套路可以像23種設計模式一樣我們可以快速套用呢?

答案是:有的。

基于前人的學習和經驗,我們可以适時套用,進而優化我們的文檔模型設計。

MongoDB入門實戰教程(8)

一個好的設計模式可以顯著地:

(1)提升資料讀寫的效率;

(2)降低資源的需求;

2 組織結構類模式

适用場景:

(1)熱銷榜:某個商品今天賣了多少,這個星期又賣了多少?...

(2)電影排行:觀影者、場次統計...

(3)傳統解決方案:通過聚合計算...

痛點總結:

消耗資源多,聚合(統計)時間較長。

解決方案:

一句話概括:使用預聚合字段!

即 在模型中直接增加統計字段,每次更新資料時同僚更新統計值。這是一種典型的以空間換時間的設計,特别适合需要較長聚合(統計)操作的場景。

示例模型:

物聯網場景下的海量監控資料、時序資料

比如:智慧城市、智慧交通場景下的監控資料

資料點采集頻繁,資料量太多,索引也很大!

一句話概括:分桶!

即 利用文檔内嵌數組,将一個時間段的資料聚合到一個文檔裡。

3 表現形式類模式

(1)産品(如sku)有很多屬性,如 color、size、dimensions等

(2)多語言(多國家)屬性等

文檔中有很多類似的字段,且會用于組合查詢,需要建立很多的索引。

一句話概括:列轉行!

即 将列 轉化為 數組,一個索引解決所有查詢問題。

任何有版本衍變的資料庫

文檔模型格式多,無法知道其合理性;

更新的時候需要更新太多的文檔;

一句話概括:增加一個版本号字段!

即 快速過濾掉不需要更新的文檔,更新的時候對不同版本的文檔做不同的處理。

4 資料通路類模式

(1)網頁計數(每次通路一個頁面都會産生一次DB計數更新操作)

(2)各種結果不需要準确的排名(統計結果的準确性并不是十分的重要)

寫入太頻繁,消耗系統資源

一句話概括:近似處理(計算)!

即 間隔寫入,每隔10次 或 100次,大量減少寫入需求。

MongoDB入門實戰教程(8)

5 總結

本文簡單介紹了MongoDB的模型設計中的三大類常用設計模式:表現形式類、資料通路類 和 組織結構類。通過學習這些設計模式,使我們可以在模型設計場景中恰當地套用這些設計模式,進而達到提升資料讀寫效率 和 降低資源的需求,最終得到一個合适的文檔模型。

下一篇,我們會學習MongoDB的索引相關知識,善用索引提高查詢效率。

本系列教程目錄: MongoDB入門實戰教程(1) MongoDB入門實戰教程(2) MongoDB入門實戰教程(3) MongoDB入門實戰教程(4) MongoDB入門實戰教程(5) MongoDB入門實戰教程(6) MongoDB入門實戰教程(7)
MongoDB入門實戰教程(8)

作者:周旭龍

本文版權歸作者擁有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

繼續閱讀