一篇文章搞懂数据仓库:三范式与反范式
少年易老學難成,一寸光陰不可輕。
目錄
一、第一范式
二、第二范式
三、第三范式
四、反范式化
五、范式化設計和反范式化設計的優(yōu)缺點
5.1 范式化 (時間換空間)
5.2 反范式化(空間換時間)
六、OLAP和OLTP中范式設計
? ? ? ?范式是符合某一種級別的關系模式的集合。構造數(shù)據(jù)庫必須遵循一定的規(guī)則。在關系數(shù)據(jù)庫中,這種規(guī)則就是范式。
? ? ? ?關系數(shù)據(jù)庫中的關系必須滿足一定的要求,即滿足不同的范式。大數(shù)據(jù)生態(tài)中,各類強大的查詢引擎層出不窮,相對廉價的磁盤和分布式技術,也讓數(shù)據(jù)冗余變得可接受甚至更加方便。
? ? ? ?在創(chuàng)建一個數(shù)據(jù)庫的過程中,范化是將其轉化為一些表的過程,這種方法可以使從數(shù)據(jù)庫得到的結果更加明確。這樣可能使數(shù)據(jù)庫產(chǎn)生重復數(shù)據(jù),從而導致創(chuàng)建多余的表。范化是在識別數(shù)據(jù)庫中的數(shù)據(jù)元素、關系以及定義所需的表和各表中的項目等這些初始工作之后的一個細化的過程。
一、第一范式
1NF要求屬性具有原子性,即列不可再分解;
表:字段1、 字段2(字段2.1、字段2.2)、字段3 ......如學生(學號,姓名,性別,出生年月日)
有些鋼筋可能要問了,姓名可以拆成姓、名兩列,?“出生年月日” 也可以拆成年、月、日三個字段。所以就不滿足第一范式了!!!這里再強調一下原子性,原子性是根據(jù)使用方便來自定義的最小單位。中國人一般姓名一起用,美國就習慣姓名分別存兩字段
二、第二范式
2NF要求記錄有惟一標識,即不存在部分依賴;
簡單來說就是拆表,以人為粒度做一張明細表,以課程號為粒度做一張維度表,兩表關聯(lián)使用,消除了數(shù)據(jù)冗余
表:學號、課程號、姓名、學分;這個表明顯說明了兩個事務:學生信息, 課程信息;由于非主鍵字段必須依賴主鍵,這里學分依賴課程號,姓名依賴與學號,所以不符合二范式。
可能會存在問題:
- 數(shù)據(jù)冗余:每條記錄都含有相同信息;
- 刪除異常:刪除所有學生成績,就把課程信息全刪除了;
- 插入異常:學生未選課,無法記錄進數(shù)據(jù)庫;
- 更新異常:調整課程學分,所有行都調整。
正確做法:?
學生:Student(學號, 姓名);?
課程:Course(課程號, 學分);?
選課關系:StudentCourse(學號, 課程號, 成績)。
三、第三范式
3NF是對字段的冗余性,要求任何字段不能由其他字段派生出來,它要求字段沒有冗余,即不存在傳遞依賴;
表: 學號, 姓名, 年齡, 學院名稱, 學院電話因為存在依賴傳遞: (學號) → (學生)→(所在學院) → (學院電話) 。
可能會存在問題:
- 數(shù)據(jù)冗余:有重復值;
- 更新異常:有重復的冗余信息,修改時需要同時修改多條記錄,否則會出現(xiàn)數(shù)據(jù)不一致的情況?。
正確做法:
學生:(學號, 姓名, 年齡, 所在學院);
學院:(學院, 電話)。
四、反范式化
一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了。
? ? 沒有冗余的數(shù)據(jù)庫設計可以做到。但是,沒有冗余的數(shù)據(jù)庫未必是最好的數(shù)據(jù)庫,有時為了提高運行效率,就必須降低范式標準,適當保留冗余數(shù)據(jù)。具體做法是:在概念數(shù)據(jù)模型設計時遵守第三范式,降低范式標準的工作放到物理數(shù)據(jù)模型設計時考慮。降低范式就是增加字段,允許冗余,達到以空間換時間的目的。
? 〖例〗:有一張存放商品的基本表,如表1所示?!敖痤~”這個字段的存在,表明該表的設計不滿足第三范式,因為“金額”可以由“單價”乘以“數(shù)量”得到,說明“金額”是冗余字段。但是,增加“金額”這個冗余字段,可以提高查詢統(tǒng)計的速度,這就是以空間換時間的作法。
? ? 在Rose 2002中,規(guī)定列有兩種類型:數(shù)據(jù)列和計算列?!敖痤~”這樣的列被稱為“計算列”,而“單價”和“數(shù)量”這樣的列被稱為“數(shù)據(jù)列”。
五、范式化設計和反范式化設計的優(yōu)缺點
5.1 范式化 (時間換空間)
優(yōu)點:
- 范式化的表減少了數(shù)據(jù)冗余,數(shù)據(jù)表更新操作快、占用存儲空間少。
缺點:
- 查詢時需要對多個表進行關聯(lián),查詢性能降低。?
- 更難進行索引優(yōu)化
5.2 反范式化(空間換時間)
反范式的過程就是通過冗余數(shù)據(jù)來提高查詢性能,但冗余數(shù)據(jù)會犧牲數(shù)據(jù)一致性
優(yōu)點:
- 可以減少表關聯(lián)
- 可以更好進行索引優(yōu)化
缺點:
- 存在大量冗余數(shù)據(jù)
- 數(shù)據(jù)維護成本更高(刪除異常,插入異常,更新異常)
六、OLAP和OLTP中范式設計
OLAP 一般冗余比較多,以查詢分析為主,這種一般都是采用反范式設計,以提高查詢效率。更新一般是定時大批量數(shù)據(jù)插入。
OLTP 則是盡可能消除冗余,以提高變更的效率。因為這種應用無時無刻不在頻繁變化。
?
?
大數(shù)據(jù)生態(tài)圈常用組件(一):數(shù)據(jù)庫、查詢引擎、ETL工具、調度工具等
傳送門:?https://blog.csdn.net/weixin_39032019/article/details/89340739
?
?
總結
以上是生活随笔為你收集整理的一篇文章搞懂数据仓库:三范式与反范式的全部內容,希望文章能夠幫你解決所遇到的問題。