SQL反模式學習筆記9 元數據分裂
- 2019 年 10 月 4 日
- 筆記
目標:支援可擴展性。優化資料庫的結構來提升查詢的性能以及支援表的平滑擴展。
反模式:克隆表與克隆列
1、將一張很長的表拆分成多張較小的表,使用表中某一個特定的數據欄位來給這些拆分出來的表命名。
2、將一個列拆分成多個之列,使用別的列中的不同值給拆分出來的列命名。
為了達到減少每張表記錄數的目的,你不得不創建一些有很多列的表,或者創建很多很多表。但是在2個方案中,
你會發現隨著數據量的增長,會有越來越多的表或者列。
缺點:(1)不斷產生新的表。要將數據拆分到不同的表中,需要一個規則來定義哪些數據屬於哪些表。
(2)管理數據完整性(不同的表定義不同的約束)。
(3)同步數據時,需要多個操作步驟。
(4)確保唯一性:需要確保所有被分隔出來的表中的主鍵都是唯一的。如果你需要從一張表中移動一條記錄到令一張表中,
需要保證被移動記錄的主鍵值不會和目標表中的主鍵記錄衝突。
(主鍵如果是自增長的Int類型,則很難保證Id一致;如果是Guid類型,則容易控制)。
(5)跨表查詢:時間時間的增長,創建了越來越多的表,就需要不斷的更新程式程式碼來引入這些新創建的表。
(6)同步元數據:如果將表進行了拆分,當新增加一個列的數據,需要再所有的表中增加這個新的列。
(7)管理引用完整性:分隔表及時作為一張關聯表而不是父表,也可能引起一些問題。
(8)標識元數據分裂列:列也可能根據元數據分類。可以創建一個含有很多列的表,這些列安裝他們的類別擴展。
如何識別反模式:當出現以下情況時,可能是反模式
1、我們需要每……創建一張表或者列?
2、資料庫支援的最大數量的表或者列是多少?
3、發現程式添加記錄失敗了:因為王佳偉新的一年添加新表了
4、如何查詢很多張表?每張表的列都是一樣的。
【如果你需要查詢很多結構一樣的表,就應該講數據全部存儲在一個表中,使用一個額外的屬性列來分組數據】
5、如何將表名稱作為一個表裡傳遞?在查詢是需要根據辯分動態的生成這些表名稱。
合理使用反模式:
手動分隔表的一個合理使用場景是「歸檔數據」—–將歷史數據從日常使用的資料庫中移除。
通常在過期數據的查詢變的非常稀少的情況下,才會進行如此的操作。
如果你沒有時間同時查詢當前數據和歷史數據的需求,將老數據從當前活動的錶轉移到其他地方是很合適的操作。
將數據歸檔到與當前表結構相兼容的新表中,既能支援偶爾做數據分析時的查詢,同時能讓日常數據查詢邊的非常高效。
【 備份並回復一個中等規模的資料庫比操作一個存儲著TB級數據的資料庫要方便得多。
儘管將數據對象模型化並將整個對象中的所有東西映射到一個單獨的資料庫中的做法沒有錯,但是合理地將大小超過
臨界值的資料庫拆分開能簡化資料庫管理的工作。
】
解決方案:分區並標準化
當一張表的數據量變的非常巨大是,除了手動拆分這張表,可以使用水平分區、垂直分區以及使用關聯表來提升查詢性能。
1、水平分區(或者叫分片):根據數據行來對錶進行拆分。同時不用擔心那些分隔表所帶來的缺陷。
僅需要定義一些規則來拆分一張邏輯表,資料庫會為你管理餘下所有的工作。
物理上來說,表的確的被拆分了,但你依舊可以向查詢單一表那樣執行SQL查詢語句。
2、垂直分區:當某些列非常龐大或者很少使用的時候,對錶進行按列拆分會比較有優勢。
Blob類型與Text類型的列大小是可變的,可能非常大。為了提高存儲於查詢性能,這些資料庫會自動地將
這些類型的列和表中的其他列分開進行存儲。如果進行一個不包含Blob類型與Text類型的查詢,就可以
更高效的獲取其他的列,查詢性能有所提高。
3、解決元數據分裂列:創建關聯表