規范化數據模型是傳統關系型數據庫設計的核心,它為如何管理關系型數據提供了最佳設計理念,但同時也限制了數據查詢的靈活性和高效率。
在雲計算、大數據等新技術的帶動下,越來越多的企業需要對結構化的數據進行查詢、分析、處理和更新。同時,隨着創新業務的不斷增加,業務的復雜及龐大的體量必然會產生錯綜復雜且規模巨大的結構化數據,這些都必然迫使企業對數據庫的需求指向大規模、高可靠、高擴展及高性能。
什么是數據去中心化
數據去中心化過程也就是數據拆分的過程。依據服務划分數據,將數據從主體數據剝離出來。
為什么需要數據去中心化
規范化數據模型是傳統關系型數據庫設計的核心,即通過三大范式實現數據的有效存儲,並為開發人員提供一整套對數據的操作方式。規范化數據模型有利有弊,它為如何管理關系型數據提供了最佳的設計理念,但同時也限制了數據查詢的靈活性和高效性,特別是當查詢涉及多關聯場景時,會導致查詢性能嚴重低下。
規范化數據模型的另一個問題在於中心化思想,即把數據統一存儲在一個中央數據庫中。當大量數據存在於同一個數據庫時會容易造成數據庫訪問瓶頸,從而影響數據訪問性能,並為系統可用性埋下隱患。
數據去中心化場景
跨表查詢場景
單庫跨表查詢相對於來說場景比較簡單,不同業務共享幾張數據表,通過關聯查詢獲取需要是數據。應對這種查詢是將關聯查詢拆分為多個單表查詢,然后將結果數據進行動態重組,從而形成業務所需要的數據。
跨庫查詢場景
跨庫查詢說明不同數據庫之間的表也存在着連接查詢操作。針對該場景,基本的解決思路有兩種:
靜態數據
針對一些修改頻率不高、相對靜態的數據而言,可以采取數據復制的方式達到同一份數據在兩個數據庫中同時存在的效果,從而將跨庫查詢轉變為同一庫中的表查詢。
動態數據
對實時性要求比較高的數據,可以通過開放接口的方式實現兩個數據庫之間的數據集成效果。
技術耦合場景
技術耦合場景表現在使用了特定某種數據存儲容器相關的技術體系。對於關系型數據庫而言,存儲過程、觸發器等就是典型的數據庫工具級別的特有技術。由於每種數據存儲容器對這些具體技術的實現和支持方式都有所不同,所以在原則上我們的業務功能都不應該使用這些技術進行數據處理。如果有,那就堅決去掉。采用的方式也是將這些存儲過程、觸發器中所涉及的業務邏輯全部用代碼重新實現一遍即可。
數據去中心化流程
數據去中心化的步驟:
代碼分離
想要對數據庫進行拆分,首先要把操作數據庫的代碼拆分出來。即把原本在單塊系統中的代碼拆分成幾個組成部分。
重復數據庫模式
代碼拆分完之后,對數據的訪問會形成兩種模式。一種是數據能夠隨着代碼完成拆分,即這些數據不存在多個系統共同訪問的情況,那簡單把數據遷移出去供單個系統訪問即可。但是很多情況下,代碼中充斥着跨表查詢,跨庫查詢和技術耦合場景,不能簡單進行數據拆分,所以作為一個過渡環節,我們可以把幾個系統公用的數據進行冗余處理。
遷移數據讀寫操作
完成數據冗余之后,將針對數據庫寫入和讀取操作做單獨抽離。一般寫入操作比較好抽離,因為插入只涉及單表。難度最大的為讀取的抽離,在沒有專門的數據拆分之前,同一份數據可能通過各種方式被很多業務所共享,會出現大量跨表查詢、跨庫查詢和技術耦合場景。
抽取服務化接口
在完成數據讀寫操作的遷移、去除數據定時同步機制之后,我們就可以對單塊系統中的代碼進行拆分,從而實現服務化。所有的數據訪問通過服務化的接口進行。
參考資料
微服務設計原理與架構 鄭天民/著(本文部分內容摘錄此書,分享知識,尊重作者)
Scott W Ambler, Pramod J Sadalage. 數據庫重構[M]. 王海鵬等譯