1. 程式人生 > >解析範式(1NF-4NF)

解析範式(1NF-4NF)

基礎上 說明 主任 解析 機械 依賴 加工廠 val 間接

一、1NF

1.1 1NF的定義:

  關系數據庫中的關系是要滿足一定要求的,滿足不同程度要求的為不同的範式。滿足最低要求是第一範式(1NF),1NF的定義如下:

    1NF:關系中的每一個分量必須是一個不可分的數據項。

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

員工表

員工編號

員工姓名

出生日期

薪資/月

所屬部門

基本工資/月

補貼/月

1

Tom

19900908

9000

1000

101

...

...

...

...

...

  上表中,出現了屬性薪資又被分為基本工資和補貼兩個子屬性,就好像表中有分割了一個小表,這就不屬於第一範式。如果將基本工資和補貼合並,那麽該表符合

1NF。

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)