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