解析正規化 1NF 4NF

2021-09-12 09:52:49 字數 4351 閱讀 3950

一、1nf

1.1 1nf的定義:

關聯式資料庫中的關係是要滿足一定要求的,滿足不同程度要求的為不同的正規化。滿足最低要求是第一正規化(1nf),1nf的定義如下:

1nf:關係中的每乙個分量必須是乙個不可分的資料項。

通俗地說,第一正規化就是表中不允許有小表的存在。比如,對於如下的員工表,就不屬於第一正規化:

員工表員工編號

員工姓名

出生日期

薪資/月

所屬部門

基本工資/月

補貼/月 1

王紅19900908

9000

1000

101...

......

......

上表中,出現了屬性薪資又被分為基本工資和補貼兩個子屬性,就好像表中有分割了乙個小表,這就不屬於第一正規化。如果將基本工資和補貼合併,那麼該錶符合1nf。

1.2 1nf存在的問題:

1nf是最低一級的正規化,正規化程度不高,存在很多的問題。比如用乙個單一的關係模式學生來描述學校的教務系統:

學生(學號,學生姓名,所在系,系主任姓名,課程號,成績)

學生表學號

學生姓名

所在系系主任姓名

課程號 成績

201102 張明

計算機系 章三

04 70

201103 王紅

計算機系 章三

05 60

201103 王紅

計算機系 章三

04 80

201103 王紅

計算機系 章三

06 87

201104 李青

機械系 王五

09 79

......

......

......

這個表滿足第一正規化,但是存在如下問題:

·資料冗餘:

乙個系有很多的學生,同乙個系的學生的系主任是相同的,所以系主任名會重複出現。

·更新複雜:

當乙個系換了乙個系主任後,對應的這個表必須修改與該系學生有關的每個元組。

·插入異常:

如果乙個系剛成立,沒有任何學生,那麼這個無法把這個系的資訊插入表中。

·刪除異常:

如果乙個系的學生都畢業了,那麼在刪除該系學生資訊時,這個系的資訊也丟了。

二、2nf

2.1 2nf的定義:

2nf:如果關係r屬於1nf,且每乙個非主屬性完全函式依賴於任何乙個候選碼,則r屬於2nf。

通俗地說,2nf就是在1nf的基礎上,表中的每乙個非主屬性不會依賴復合主鍵中的某乙個列。

按照定義,上面的學生表就不滿足2nf,因為學號不能完全確定課程號和成績(每個學生可以選多門課)。將學生表分解為:學生(學號,學生姓名,系編號),系(系編號,系名,系主任),選課(學號,課程號,成績)。每張表均屬於2nf。

2.2 2nf存在的問題:

下面舉例說明2nf存在的相應問題。

對於公司裡的員工管理,每個員工只能屬於乙個部門,每個部門可以有多個員工,定義如下關係模式:

員工管理表(員工id,員工名,所屬部門id,部門經理);

對應的表:

員工管理表

員工號員工名

所屬部門

部門經理

001 小王

銷售部 張三

002 小張

銷售部 張三

003 小劉

研發部 李四

......

......

存在的問題:

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表

snopno

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表

snopno

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。

posted @

2017-10-23 15:55

一直是小學生 閱讀(

...)

編輯收藏

什麼是正規化,1NF,2NF,3NF?

關聯式資料庫設計正規化介紹 正規化是符合某一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 第四正規化 4nf 第五正規化 5nf 和第六正規化 6nf 1 第一正規化 1n...

關於正規化 1NF 2NF 3NF等

1.一些術語 正規化 normal form 是指資料庫設計的正規化,是抽象型的。關係模式 relational scheme 由乙個關係名以及它所有的屬性名構成。它對應二維表的表頭,是二維表的構成框架 邏輯結構 其格式為 關係名 屬性名1 屬性名2 屬性名n 關係 relation 表示多個實體之...

資料庫三正規化1NF2NF3NF

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小 第一正規化 1nf 資料庫表中的所有字段值都是不可分解的原子值。即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項...