天天看點

一篇文章搞懂資料倉庫:三範式與反範式

少年易老學難成,一寸光陰不可輕。

​​目錄​​

​​一、第一範式​​

​​二、第二範式​​

​​三、第三範式​​

​​四、反範式化​​

​​五、範式化設計和反範式化設計的優缺點​​

​​5.1 範式化 (時間換空間)​​

​​5.2 反範式化(空間換時間)​​

​​六、OLAP和OLTP中範式設計​​

       範式是符合某一種級别的關系模式的集合。構造資料庫必須遵循一定的規則。在關系資料庫中,這種規則就是範式。

       關系資料庫中的關系必須滿足一定的要求,即滿足不同的範式。大資料生态中,各類強大的查詢引擎層出不窮,相對廉價的磁盤和分布式技術,也讓資料備援變得可接受甚至更加友善。

       在建立一個資料庫的過程中,範化是将其轉化為一些表的過程,這種方法可以使從資料庫得到的結果更加明确。這樣可能使資料庫産生重複資料,進而導緻建立多餘的表。範化是在識别資料庫中的資料元素、關系以及定義所需的表和各表中的項目等這些初始工作之後的一個細化的過程。

一、第一範式

1NF要求屬性具有原子性,即列不可再分解;

表:字段1、 字段2(字段2.1、字段2.2)、字段3 ......

如學生(學号,姓名,性别,出生年月日)

有些鋼筋可能要問了,姓名可以拆成姓、名兩列, “出生年月日” 也可以拆成年、月、日三個字段。是以就不滿足第一範式了!!!這裡再強調一下原子性,原子性是根據使用友善來自定義的最小機關。中國人一般姓名一起用,美國就習慣姓名分别存兩字段

二、第二範式

2NF要求記錄有惟一辨別,即不存在部分依賴;

簡單來說就是拆表,以人為粒度做一張明細表,以課程号為粒度做一張次元表,兩表關聯使用,消除了資料備援

表:學号、課程号、姓名、學分;

這個表明顯說明了兩個事務:學生資訊, 課程資訊;由于非主鍵字段必須依賴主鍵,這裡學分依賴課程号,姓名依賴與學号,是以不符合二範式。

可能會存在問題:

  • ​資料備援:​

    ​每條記錄都含有相同資訊;
  • ​删除異常:​

    ​删除所有學生成績,就把課程資訊全删除了;
  • ​插入異常:​

    ​學生未選課,無法記錄進資料庫;
  • ​更新異常:​

    ​調整課程學分,所有行都調整。

正确做法: 

學生:​​

​Student​

​​(學号, 姓名); 

課程:​​

​Course​

​​(課程号, 學分); 

選課關系:​​

​StudentCourse​

​(學号, 課程号, 成績)。

三、第三範式

3NF是對字段的​

​備援性​

​,要求任何字段不能由其他字段派生出來,它要求字段沒有備援,即不存在傳遞依賴;

表: 學号, 姓名, 年齡, 學院名稱, 學院電話

因為存在依賴傳遞: (學号) → (學生)→(所在學院) → (學院電話) 。

可能會存在問題:

  • ​資料備援:​

    ​有重複值;
  • ​更新異常:​

    ​有重複的備援資訊,修改時需要同時修改多條記錄,否則會出現資料不一緻的情況。

正确做法:

學生:(學号, 姓名, 年齡, 所在學院);

學院:(學院, 電話)。

四、反範式化

一般說來,資料庫隻需滿足第三範式(​

​3NF​

​)就行了。

    沒有備援的資料庫設計可以做到。但是,沒有備援的資料庫未必是最好的資料庫,有時為了提高運作效率,就必須降低範式标準,适當保留備援資料。具體做法是:在概念資料模型設計時遵守第三範式,降低範式标準的工作放到實體資料模型設計時考慮。降低範式就是增加字段,允許備援,​

​達到以空間換時間的目的​

​。

  〖例〗:有一張存放商品的基本表,如表1所示。“金額”這個字段的存在,表明該表的設計不滿足第三範式,因為“金額”可以由“單價”乘以“數量”得到,說明“金額”是備援字段。但是,增加“金額”這個備援字段,可以提高查詢統計的速度,這就是以空間換時間的作法。

    在​

​Rose 2002​

​中,規定列有兩種類型:資料列和計算列。“金額”這樣的列被稱為“計算列”,而“單價”和“數量”這樣的列被稱為“資料列”。

五、範式化設計和反範式化設計的優缺點

5.1 範式化 (時間換空間)

優點:

  • 範式化的表減少了資料備援,資料表更新操作快、占用存儲空間少。

缺點:

  • 查詢時需要對多個表進行關聯,查詢性能降低。
  • 更難進行索引優化

5.2 反範式化(空間換時間)

反範式的過程就是通過備援資料來提高查詢性能,但備援資料會犧牲資料一緻性

優點:

  • 可以減少表關聯
  • 可以更好進行索引優化

缺點:

  • 存在大量備援資料
  • 資料維護成本更高(删除異常,插入異常,更新異常)

六、OLAP和OLTP中範式設計

OLAP 一般備援比較多,以查詢分析為主,這種一般都是采用反範式設計,以提高查詢效率。更新一般是定時大批量資料插入。

OLTP 則是盡可能消除備援,以提高變更的效率。因為這種應用無時無刻不在頻繁變化。

大資料生态圈常用元件(一):資料庫、查詢引擎、ETL工具、排程工具等