當我們總結使用模式構建系列時,這是一個很好的機會,可以回顧一下已涵蓋的模式解決的問題,並突出顯示每種模式具有的一些好處和權衡。 關於模式設計模式的最常見問題是「我正在設計一個應用程序來執行 X,如何對數據進行建模?」 正如我們希望您在本博客系列的過程中發現的那樣,有很多事情需要考慮來回答這個問題。 不過,我們已經包含了範例使用案例圖表,我們發現該圖表對於至少提供一些一般使用案例資料建模模式的初始指引很有幫助。
使用案例範例
下圖是我們在與客戶合作多年的經驗之後發現的指導方針,了解各種應用程序中使用了哪些模式設計模式。 這不是一套關於哪種設計模式可用於特定類型的應用程序的「石頭集」的規則。 請務必查看使用案例中經常使用的項目。 但是,不要丟棄其他的,它們可能仍然適用。 您如何設計應用程序的數據模式非常依賴於您的數據訪問模式。
設計模式摘要
近似值
當經常完成昂貴的計算以及這些計算的精確度不是最高優先級時,「近似模式 非常有用。
優點
- 對數據庫的寫入更少。
- 保持統計學上有效的數字。
缺點
- 確切的數字沒有被表示。
- 實現必須在應用程序中完成。
屬性
屬性模式對於圍繞具有許多類似字段的大文檔的問題非常有用,但是存在共享共同特徵的字段的子集,我們希望對該字段子集進行排序或查詢。 當我們需要排序的字段只能在文檔的一小部分中找到。 或者當文檔中滿足這兩個條件時。
優點
- 需要較少的索引。
- 查詢變得更容易編寫,並且通常速度更快。
水桶
值區模式是需要管理串流資料時的絕佳解決方案,例如時間序列、即時分析或物聯網 (IoT) 應用程式
優點
- 減少集合中文檔的總數。
- 改善索引效能。
- 可利用預先彙總來簡化資料存取。
计算
當有非常密集讀取的資料存取模式,而且應用程式需要重複計算資料時,「計算模式」是一個很好的探索選項。
優點
- 減少頻繁運算的 CPU 工作負載。
- 查詢變得更容易編寫,並且通常速度更快。
缺點
- 可能很難確定對此模式的需求。
- 除非需要,否則應避免套用或過度使用圖案。
文件版本化
當您遇到需要在 MongoDB 中維護以前版本的文檔時,文檔版本控制模式是一種可能的解決方案。
優點
- 易於實施,即使在現有系統上也是如此。
- 對最新版本的查詢沒有效能影響。
缺點
- 寫入次數加倍。
- 查詢需要定位正確的集合。
延伸參考
你會發現擴展參考模式最有用的時候,你的應用程序正在經歷大量的 JOIN 操作,以匯集經常訪問的數據。
優點
- 當有大量 JOIN 操作時,可提高性能。
- 更快的讀取速度並減少 JOIN 的整體數量
缺點
- 資料複製。
離群值
您是否發現有一些查詢或文檔不適合其餘的典型數據模式? 這些例外情況是否會推動您的應用程式 如果是這樣,離群模式是解決這種情況的絕佳解決方案。
優點
- 防止一些文件或查詢判斷應用程式的解決方案。
- 查詢是為「典型」用例量身定制的,但離群值仍然可以解決。
缺點
- 通常針對特定查詢量身定制,因此臨機操作查詢可能無法良好執行。
- 大部分這種模式是通過應用程序代碼完成的。
預先分配
當您知道文件結構且應用程式只需要填入資料時,「預先配置模式」是正確的選擇。
優點
- 事先知道文件結構時的設計簡化。
缺點
- 簡單性與效能。
多態
多態模式是解決方案,當有各種各樣的文檔具有比差異更多的相似性和文檔需要保存在一個單一的集合。
優點
- 易於實施。
- 查詢可以跨單一集合執行。
架構版本控
幾乎每個應用程序都可以從模式版本化模式中受益,因為數據模式的更改經常發生在應用程序的生命週期中。 此模式可讓先前版本和目前版本的文件並排存在於集合中。
優點
- 無需停機時間。
- 控制結構描述移轉。
- 減少未來的技術債務。
缺點
- 在移轉期間,相同欄位可能需要兩個索引。
子集
子集模式解決了具有工作集超過 RAM 的容量的問題,由於文檔中有大量的數據沒有被應用程序使用的大文檔。
優點
- 減少工作集的整體尺寸。
- 縮短最常使用資料的磁碟存取時間。
缺點
- 我們必須管理子集。
- 提取其他資料需要額外的行程到資料庫。
樹
當數據是一個層次結構,並且經常被查詢,樹模式是要實現的設計模式。
優點
- 通過避免多個 JOIN 操作來提高性能。
缺點
- 需要在應用程式中管理圖形的更新。
結論
正如我們希望您在本系列中看到的那樣,MongoDB 文檔模型在您如何建模數據提供了很大的靈活性。 這種靈活性非常強大,但是需要根據應用程序的數據訪問模式來利用這種力量。 請記住,MongoDB 中的結構描述設計會對應用程式的效能產生巨大的影響。 我們發現效能問題通常可能會追蹤到結構描述設計不良。
請記住,為了進一步增強文檔模型的功能,這些模式設計模式可以在有意義的時間和時間一起使用。 例如,結構描述版本控制可以與任何其他模式一起使用,因為您的應用程式發展。 有了十二種結構描述設計模式,您可以擁有運用文件模型彈性強大功能所需的工具和知識。