解析範式(1NF-4NF)
一、1NF
1.1 1NF的定義:
關系數據庫中的關系是要滿足一定要求的,滿足不同程度要求的為不同的範式。滿足最低要求是第一範式(1NF),1NF的定義如下:
1NF:關系中的每一個分量必須是一個不可分的數據項。
通俗地說,第一範式就是表中不允許有小表的存在。比如,對於如下的員工表,就不屬於第一範式:
員工表
員工編號 |
員工姓名 |
出生日期 |
薪資/月 |
所屬部門 |
|
基本工資/月 |
補貼/月 |
||||
1 |
Tom |
19900908 |
9000 |
1000 |
101 |
... |
... |
... |
... |
... |
|
上表中,出現了屬性薪資又被分為基本工資和補貼兩個子屬性,就好像表中有分割了一個小表,這就不屬於第一範式。如果將基本工資和補貼合並,那麽該表符合
1.2 1NF存在的問題;
1NF是最低一級的範式,範式程度不高,存在很多的問題。比如用一個單一的關系模式學生來描述學校的教務系統:
學生(學號,學生姓名,所在系,系主任姓名,課程號,成績)
學生表
學號 |
學生姓名 |
所在系 |
系主任姓名 |
課程號 |
成績 |
201102 |
ABB |
計算機系 |
章三 |
04 |
70 |
201103 |
AAA |
計算機系 |
章三 |
05 |
60 |
201103 |
AAA |
計算機系 |
章三 |
04 |
80 |
201103 |
AAA |
計算機系 |
章三 |
06 |
87 |
201104 |
ABC |
機械系 |
王五 |
09 |
79 |
... |
... |
... |
... |
... |
... |
假如選定學號為主鍵,這個表滿足第一範式,但是存在如下問題:
·數據冗余:
一個系有很多的學生,同一個系的學生的系主任是相同的,所以系主任名會重復出現。
·更新復雜:
當一個系換了一個系主任後,對應的這個表必須修改與該系學生有關的每個元組。
·插入異常:
如果一個系剛成立,沒有任何學生,那麽這個無法把這個系的信息插入表中。
·刪除異常:
如果一個系的學生都畢業了,那麽在刪除該系學生信息時,這個系的信息也丟了。
二、2NF
2.1 2NF的定義:
2NF的定義如下:
如果關系R屬於1NF,且每一個非主屬性完全函數依賴於任何一個候選碼,則R屬於2NF。
通俗地說,2NF就是在1NF的基礎上,表中的每一個非主屬性不會依賴復合主鍵中的某一個列。
按照定義,上面的學生表就不滿足2NF,因為學號不能完全確定課程號和成績(每個學生可以選多門課)。將學生表分解為:學生(學號,學生姓名,系編號),系(系編號,系名,系主任),選課(學號,課程號,成績)。每張表均屬於2NF。
新定義一張表:銷售表(產品id,地區id,價格,產品名),同一個產品在不同地區價格不同。這個表就不屬於2NF,因為非主屬性產品名不是完全函數依賴於主鍵,而是完全依賴於產品id,即表中存在非主屬性對主鍵的部分依賴。將銷售表分解:產品(產品id,產品名),銷售表(產品id,地區id,價格)。每張表均屬於2NF。
2.2 2NF存在的問題:
下面舉例說明2NF存在的相應問題。
對於公司裏的員工管理,每個員工只能屬於一個部門,每個部門可以有多個員工,定義如下關系模式:
員工管理表(員工id,員工名,所屬部門id,部門經理);
對應的表:
員工id |
員工名 |
所屬部門 |
部門經理 |
001 |
Tom |
銷售部 |
張三 |
002 |
Marry |
銷售部 |
張三 |
003 |
Mike |
研發部 |
李四 |
... |
... |
... |
... |
存在的問題:
1、刪除異常:
如果某個部門的人都跳槽了,那麽在刪除這些員工的同時也丟失了這個部門的信息。
2、修改復雜:
如果一個員工換了一個部門,不但要修改所屬部門,還要修改部門經理這個屬性列。
3、插入異常:
如果公司新成立了一個部門,但是目前沒有招收員工,那麽這個部門信息也無法插入到這個表中,因為沒有主鍵。
三、3NF
3.1 3NF的定義:
3NF的定義:在滿足1NF的基礎上,表中不存在非主屬性對碼的傳遞依賴。也就是說表中非主屬性不會間接地依賴於碼。
如上面的員工管理表就不屬於3NF,因為非主屬性部門經理依賴於所屬部門,所屬部門依賴於員工id,即部門經理傳遞依賴於員工id。將員工管理表分解:員工管理(員工id,員工名,部門名),部門(部門名,部門經理)。則每張表均屬於3NF。
3.2 3NF存在的問題:
現在有這樣的一個場景:對於一個工程(ENO)的實施,每個工程需要多個零件,每個供應商(SNO)只生產一個零件(PNO)且受工廠規模所限只能同時供應一個工程,每個工程使用的同一個零件都來自同一個生產商。
定義關系模式:SPE(SNO,PNO,ENO)。
SPE表
SNO |
PNO |
ENO |
上海齒輪加工廠 |
齒輪 |
造船工程 |
上海螺母加工廠 |
螺母 |
造船工程 |
鞍山鋼床加工廠 |
鋼床 |
造船工程 |
天津齒輪加工廠 |
齒輪 |
機車制造工程 |
天津螺母加工廠 |
螺母 |
機車制造工程 |
... |
... |
... |
上表中存在如下函數依賴:
(ENO,PNO)→SNO
(ENO,SNO)→PNO
SNO→PNO
SPE是屬於3NF的,因為根據定義,表中不存在非主屬性對碼的傳遞依賴和部分依賴。但是這張表存在如下的問題:
1、插入異常:
如果有一個新的工廠建立了,但是這家工廠還沒有接到任何訂單,那麽無法將這個工廠信息插入到SPE中,因為缺少了主屬性ENO。
2、刪除異常:
如果某個供應商只給一個工程提供零件,現在這個工程不再需要這個零件了。那麽PNO就要刪除,而PNO是主屬性,整個元組都被刪除了,這樣就丟失了一個供應商信息。
四、BCNF
4.1 BCNF的定義:
BCNF比3NF更進一步,可以認為是擴充的3NF,其定義如下:
在第一範式的基礎上,若關系R中的每一個決定因素都必含有碼,則關系R屬於BCNF。
很顯然,上面的SPE表不屬於BCNF,因為SPE中存在一個決定因素SNO,SNO不含有碼。將SPE表分解:SP(SNO,PNO),SE(SNO,ENO)。則每張表均屬於BCNF。
4.2 BCNF存在的問題:
仍以上面的工程實施場景為例:假設每個供應商可以生產多個零件,可以供應給多個工程,一個工程需要多個零件,但同一個工程的同一個零件必須來自同一個供應商。
那麽關系SPE(SNO,PNO,ENO)對應的表數據可能是如下:
SPE表
SNO |
PNO |
ENO |
S1 |
P1 |
E1 |
S1 |
P1 |
E2 |
S1 |
P1 |
E3 |
S1 |
P2 |
E1 |
S1 |
P2 |
E2 |
S1 |
P2 |
E3 |
S2 |
P5 |
E4 |
S2 |
P5 |
E5 |
S2 |
P7 |
E4 |
... |
... |
... |
此時表SPE存在如下的函數依賴:
(PNO,ENO)→SNO
根據BCNF的定義,此時表SPE屬於BCNF。但是這樣的關系模式仍具有不好的地方:數據冗余度太大。假如供應商S3生產了n個零件,每個零件供應給m個工程,那麽顯然S3要在表中重復m*n次。
五、4NF
5.1 4NF的定義:
關系模式R屬於1NF,對於R中的每一個非平凡多值依賴X→→Y,X都含有碼,則R屬於4NF。
通俗地說,對於有三個屬性的表,給定屬性A一個值,剩余兩個列之間不存在多對多的關系。例如,在上面的SPE表中,給定SNO=S1,PNO和ENO之間很明顯存在多對多的關系,故上表是不屬於4NF的。
根據4NF的定義可知,4NF所允許的非平凡的多值依賴實際上就是函數依賴,4NF就是消除表中的非平凡多值依賴關系。
5.2 4NF存在的問題:
一般地,4NF屬於規範程度比較高的範式了。但是考慮到連接依賴的話,4NF中也仍存在數據冗余,插入、修改、刪除異常等問題。如果消除了4NF中的連接依賴,則達到了5NF的關系模式。
六、對範式的學習總結:
如果只考慮函數依賴,那麽BCNF範式最徹底,已消除插入和刪除的異常。對比3NF,其不徹底性表現在表中可能存在主屬性對碼的部分依賴和傳遞依賴。
如果考慮到多值依賴,那麽4NF範式是規範程度最高的。但4NF中可能存在連接依賴的關系,而5NF可以消除連接依賴。
在數據庫中,有時並不是規範化程度越高越好。因為範式越高,產生的表就越多,一個簡單的查詢就可能涉及到多張表的關聯。一般地,數據庫中的表都在3NF。
解析範式(1NF-4NF)