文章目錄
- 對冗餘的控制(反範式模式)
- 數據庫三範式:
- 反規範化的壞處
- 考慮冗餘
- 打破範式的7種常見方式
- 1. Combine 1:1 relationships 合併1-1關係
- 2. Duplicating(重複) nonkey columns in 1:* relationships to reduce joins 爲了減少連接操作,在1-多關係中間複製非關鍵字屬性
- 3. Duplicating FK columns in 1:* relationships to reduce joins 爲了減少連接操作,在1-多關係中間複製外部關鍵字
- 4. Duplicating columns in \*:* relationships to reduce joins 爲了減少連接操作,在多-多關係中間複製屬性
- 5. Introducing repeating groups 引入重複數據
- 6. Creating extract tables 合併基本表和查找表,創建提取表
- 7. Partitioning tables 分區,分割物理表(第五章講過了)
對冗餘的控制(反範式模式)
數據庫三範式:
- 一範式:一個字段只有一個值
- 二範式:一條記錄可以被唯一的字段的組合所區分(一個實體有唯一的標識),是對於實體完整性的要求
- 三範式:字段和字段之間不存在函數依賴。兩個字段之間不能夠進行函數推導。比如有兩個字段,一個字段是身份證號,一個字段是出生日期;前者可以推導出後者,所以最好不應該同時存在。
反規範化的壞處
- 會使得實現變得更加複雜,因爲需要手動保持數據完整性
- 會降低數據的靈活性
- 會加速元組檢索的速度,但是一定會減慢更新的速度。
- 如果系統具有低修改率和高查詢率,那麼規範弱化是一種可行的選擇。
- 如果根據某種規則打破範式,那麼需要根據相應的解決方案來手動保證打破範式之後的數據完整性。
- 反規範化需要先根據三範式設計出數據表,然後在設計出的表上進行反規範化
- 可以通過ER實體關係模型先設計出表,然後構建出滿足三範式的表
考慮冗餘
- 放棄完全規範化,得到某些性能上的好處。最好只在系統不滿足其性能要求的時候才考慮打破範式。
打破範式的7種常見方式
1. Combine 1:1 relationships 合併1-1關係
2. Duplicating(重複) nonkey columns in 1:* relationships to reduce joins 爲了減少連接操作,在1-多關係中間複製非關鍵字屬性
- 對於“錢”這個屬性,一般都需要打破範式進行存儲
3. Duplicating FK columns in 1:* relationships to reduce joins 爲了減少連接操作,在1-多關係中間複製外部關鍵字
- 模式本質:出現A<–B<–C這種連接模式的時候,可以改成A<–B,A<–C,B<–C,以此減少連接。
4. Duplicating columns in *😗 relationships to reduce joins 爲了減少連接操作,在多-多關係中間複製屬性
- 適用類型:A–>B<–C,且對於B,兩邊的表都是*-1或者1-*,這樣A於C就是一個多對多的關係。這就可以打破範式。其實也是1對多情況下打破範式的一種延伸
5. Introducing repeating groups 引入重複數據
- 比如電話、地址這樣的,那麼一個用戶會擁有多個地址和電話號碼,一組地址和一組電話號碼就是重複組。如果需要滿足三範式,那就需要單獨建立一張地址或者電話號碼的表,然後再做連接查詢。
- 大概的方式有兩種:
- 把重複組全部打包放在主表中間(一個用戶可能有5個電話號碼或者地址的字段)。但是需要滿足:重複組的絕對數量是一致的切無法改變;該數量不能很大,一般不能大於10個
- 主表中存儲缺省的1個電話號碼/1個地址;當你真的需要所有的地址和電話號碼的時候,再從那些電話號碼錶/地址表裏面去拿。(大部分查詢只需要取缺省值而不需要做連接查詢)
6. Creating extract tables 合併基本表和查找表,創建提取表
- 什麼查詢慢,就把這些查詢所需要用的表全部連接成一個大表並存儲下來。
- 但是需要這些數據不經常改變,也不需要查詢非常實時的數據,允許數據有一點點延遲。
- 如果需要實時計算,會拖垮更新的操作
- 不到萬不得已不要使用
- “在一張數據表中構建數據倉庫”