# 云計算設計模式(十四)——實體化視圖模式
產生過在一個或多個數據存儲中的數據預填充的觀點時,數據被格式化以不利于所需的查詢操作的一種方式。這種模式可以幫助支持高效的查詢和提取數據,并提高應用程序的性能。
## 背景和問題
何時存儲數據時,優先級為開發者和數據管理員經常集中在如何將數據存儲,而不是它是如何讀出。所選擇的存儲格式通常是密切相關的數據,用于管理數據的大小和數據的完整性,并且在使用的那種存儲的要求的格式。例如,使用的 NoSQL 文獻商店時,該數據通常被表示為一系列的聚集體,其每一個包含了所有的信息,該實體。
然而,這可能對查詢產生負面影響。當查詢需要從一些實體,如訂單的幾個客戶沒有所有的順序的信息的匯總的數據的一個子集,它必須提取所有的相關實體的數據,以獲得所需的信息。
## 解決方案
以支持高效的查詢,一個常見的解決方案是生成,預先,即物化數據中最適合于所要求的結果集的格式的圖。其中源數據不是一個格式適合于查詢,在那里產生一個合適的查詢中的實體化視圖模式描述產生數據的預先填充的觀點在環境中是困難的,或者其中的查詢性能差,由于該數據或該性質數據存儲區。
這些實例化視圖,其中只包含一個查詢所需的數據,以便應用程序能夠快速獲得他們需要的信息。除了連接表或組合的數據實體,物化視圖可以包括計算列或數據項的指定作為查詢的一部分的當前值,組合值或對數據項執行的轉換的結果,和值。物化視圖甚至可以就某一個單一的查詢優化。
關鍵的一點是,一個實體化視圖,它包含的數據完全是一次性的,因為它可以完全從源數據存儲重建。實例化視圖是不能直接更新的應用程序,因此它實際上是一個專門的緩存。
何時該視圖更改源數據,視圖必須被更新以包括新的信息。這可以在適當的日程自動發生,或在系統檢測到變化到原始數據的時候。在其他情況下,可能需要手動重新生成視圖。
圖1示出如何實體化視圖圖案可能被使用的例子。

圖1 - 實體化視圖模式
## 問題和注意事項
在決定如何實現這個模式時,請考慮以下幾點:
- 考慮如何以及何時該視圖將被更新。理想的情況下,將被再生響應于一個事件,指示改變到所述源數據,盡管在某些情況下,這可能導致過度的開銷,如果源數據發生急劇的變化。或者,考慮使用計劃任務,外部觸發或手動操作來啟動該視圖的再生。
- 在某些系統中,使用事件采購圖案保持僅修改的數據的事件存儲區時,例如,實體化視圖可能是必要的。通過檢查所有事件,以確定當前狀態預先填充的觀點可以得到從事件存儲信息的唯一方式。在使用事件采購時比其它情況下,有必要測量的優點是物化視圖可以提供。物化視圖往往是專門針對一個或少數的查詢。如果許多查詢必須被使用,維護實例化視圖可能會導致不可接受的存儲容量的要求和存儲成本。
- 生成的視圖時,和更新視圖時,如果這發生在一個日程表考慮數據一致性的影響。如果源數據發生了變化時,生成的視圖時的點,在該視圖中的數據的復制可能會與原來的數據完全一致。
- 考慮在那里你將存儲的視圖。認為不必位于同一商店或分區的原始數據。它可能是從幾個不同的分區合并的一個子集。
- 如果視圖是短暫的,僅僅是用來通過反映該數據的當前狀態來提高查詢性能,或提高擴展性,它可被存儲在高速緩存中或者在一個較不可靠的位置。它可以的,如果失去了重建。
- 當定義一個實體化視圖中,在數據項或列的基礎上計算的或現有的數據項的轉換的視圖,在查詢傳遞的值,或者對這些值,其中,這是適當的組合發揮其最大價值。
- 凡存儲機制支持它,考慮索引實體化視圖,以進一步提高性能。大多數關系型數據庫支持索引的意見,因為這樣做是基于Apache Hadoop的大數據解決方案。
## 何時使用這個模式
這種模式非常適合于:
- 創建實例化視圖以上數據是難以直接查詢,或者查詢必須以提取存儲在歸一化,半結構化或非結構化的方式數據非常復雜。
- 創建臨時視圖,可以顯著提高查詢性能,或可直接充當UI源視圖或數據傳輸對象(DTO 的),進行報告,或進行顯示。
- 支持偶爾連接或斷開連接的情況,其中連接到數據存儲并不總是可用的。該視圖可能在這種情況下被本地緩存。
- 簡化查詢和在不需要源數據格式的知識的方式曝光數據用于實驗。例如,通過在一個或多個數據庫,或在 NoSQL 的存儲的一個或多個結構域結合不同的表,然后格式化的數據,以滿足它的最終用途。
- 提供訪問源數據的特定子集,出于安全或隱私原因,不應該是一般訪問,公開進行修改,或者完全暴露給用戶。
- 使用基于他們的個人能力不同的數據存儲在彌合脫節。例如,通過使用云存儲中是有效率的用于寫入作為基準數據存儲,并能提供良好的查詢和讀取性能保持實例化視圖的關系數據庫。
這種模式可能不適合于下列情況:
- 源數據簡單,便于查詢。
- 源數據非常迅速的變化,或者可以在不使用視圖來訪問。中創建視圖處理開銷可能會避免在這些情況下。
- 一致性是一個高優先級。的意見可能并不總是與原始數據完全一致。
## 例子
圖2示出了使用實體化視圖模式的一個例子。在訂單,訂單項數據,并在微軟的Azure存儲帳戶單獨的分區表的客戶相結合,生成包含在電子類別中的每個產品銷售總額的視圖,客戶是誰的采購數量的計數在一起每個項目。

圖2 - 使用實體化視圖模式產生銷售的總結
創建這個實例化視圖需要復雜的查詢。然而,通過將查詢結果作為實體化視圖,用戶可以輕松獲得的結果和直接使用它們,或將其納入另一個查詢。觀點很可能在一個報告系統或儀表板中使用,所以可以更新計劃的基礎上,如每周一次。
> 注意: 雖然這個例子使用的 Azure 表存儲,許多關系數據庫管理系統還提供了實例化視圖的原生支持。
- 前言
- (一)—— 緩存預留模式
- (二)—— 斷路器模式
- (三)—— 補償交易模式
- (四)——消費者的競爭模式
- (五)——計算資源整合模式
- (六)——命令和查詢職責分離(CQRS)模式
- (七)——事件獲取模式
- (八)——外部配置存儲模式
- (九)—— 聯合身份模式
- (十)——守門員模式
- (十一)—— 健康端點監控模式
- (十二)—— 索引表模式
- (十三)——領導人選舉模式
- (十四)——實體化視圖模式
- (十五)—— 管道和過濾器模式
- (十六)——優先級隊列模式
- (十七)—— 基于隊列的負載均衡模式
- (十八)—— 重試模式
- (十九)——運行重構模式
- (二十)—— 調度程序代理管理者模式
- (二十一)——Sharding 分片模式
- (二十二)——靜態內容托管模式
- (二十三)——Throttling 節流模式
- (二十四)—— 仆人鍵模式