一篇文章搞懂数据仓库:三范式与反范式
少年易老學難成,一寸光陰不可輕。
目錄
一、第一范式
二、第二范式
三、第三范式
四、反范式化
五、范式化設計和反范式化設計的優缺點
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工具、調度工具等
傳送門:?https://blog.csdn.net/weixin_39032019/article/details/89340739
?
?
總結
以上是生活随笔為你收集整理的一篇文章搞懂数据仓库:三范式与反范式的全部內容,希望文章能夠幫你解決所遇到的問題。