程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> 數據庫-范式(NormalForm,NF)

數據庫-范式(NormalForm,NF)

編輯:SyBase教程

數據庫-范式(NormalForm,NF)


設K為R<U,F>中的屬性或屬性組合。若K    U,  則K稱為R的侯選碼,或候選鍵(Candidate Key)。
     若候選碼多於一個,則選定其中的一個做為主碼,或主鍵(Primary Key)。

主屬性與非主屬性
包含在任何一個候選碼中的屬性 ,稱為主屬性(Prime attribute)
不包含在任何碼中的屬性稱為非主屬性(Nonprime attribute)或非碼屬性(Non-key attribute)
全碼
整個屬性組是碼,稱為全碼(All-key)

[例2]
    關系模式S(Sno,Sdept,Sage),單個屬性Sno是碼,
    SC(Sno,Cno,Grade)中,(Sno,Cno)是碼
[例3]
       關系模式R(P,W,A)
       P:演奏者     W:作品    A:聽眾
       一個演奏者可以演奏多個作品
       某一作品可被多個演奏者演奏
       聽眾可以欣賞不同演奏者的不同作品
       碼為(P,W,A),即All-Key  
關系模式 R 中屬性或屬性組X 並非 R的碼,但 X 是另一個關系模式的碼,則稱 X 是R 的外部碼(Foreign key)也稱外碼
如在SC(Sno,Cno,Grade)中,Sno不是碼,但Sno是關系模式S(Sno,Sdept,Sage)的碼,則Sno是關系模式SC的外部碼 
主碼與外部碼一起提供了表示關系間聯系的手段

范式(Normal Form, NF)

范式是符合某一種級別的關系模式的集合
關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式
范式的種類:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF)
第四范式(4NF)
第五范式(5NF)
各種范式之間存在聯系:

某一關系模式R為第n范式,可簡記為R∈nNF。
一個低一級范式的關系模式,通過模式分解可以轉換為若干個高一級范式的關系模式的集合,這種過程就叫規范化

2NF

1NF的定義
如果一個關系模式R的所有屬性都是不可分的基本數據項,則R∈1NF
第一范式是對關系模式的最起碼的要求。不滿足第一范式的數據庫模式不能稱為關系數據庫模式
但是滿足第一范式的關系模式並不一定是一個好的關系模式

[例4] 關系模式 S-L-C(Sno, Sdept, Sloc, Cno, Grade)
    Sloc為學生住處,假設每個系的學生住在同一個地方

函數依賴包括:
           (Sno, Cno) F  Grade
           Sno → Sdept
           (Sno, Cno)  P  Sdept
           Sno → Sloc
           (Sno, Cno) P   Sloc
           Sdept → Sloc (語義:每個系的學生住在同一個地方)

S-L-C的碼為(Sno, Cno)
S-L-C滿足第一范式。
非主屬性Sdept和Sloc部分函數依賴於碼(Sno, Cno)
(1) 插入異常
(2) 刪除異常
(3) 數據冗余度大
(4) 修改復雜
S-L-C不是一個好的關系模式

原因
      Sdept、 Sloc部分函數依賴於碼。
解決方法
     S-L-C分解為兩個關系模式,以消除這些部分函數依賴 
            SC(Sno, Cno, Grade)
                   S-L(Sno, Sdept, Sloc)
2NF的定義
    定義6.6  若R∈1NF,且每一個非主屬性完全函數依賴於碼,則R∈2NF。

    例:S-L-C(Sno, Sdept, Sloc, Cno, Grade) ∈1NF
           S-L-C(Sno, Sdept, Sloc, Cno, Grade) ∈2NF     
           SC(Sno, Cno, Grade) ∈ 2NF
            S-L(Sno, Sdept, Sloc) ∈ 2NF

將一個1NF的關系分解為多個2NF的關系,可以在一定程度上減輕原1NF關系中存在的插入異常、刪除異常、數據冗余度大、修改復雜等問題。

將一個1NF關系分解為多個2NF的關系,並不能完全消除關系模式中的各種異常情況和數據冗余。
分解成2NF模式集的算法
設關系模式R(U),主鍵是W,R上還存在FD X→Z,並且Z是非主屬性和X?W,那麼W→Z就是一個局部依賴。此時應把R分解成兩個模式
R1(XZ),主鍵是X;
R2(Y),其中Y=U-Z,主鍵仍是W,
外鍵是X(REFERENCES R1)。
利用外鍵和主鍵的連接可以從R1和R2重新得到R。
如果R1和R2還不是2NF,則重復上述過程,一直到數據庫模式中每一個關系模式都是2NF為止。
請思考: 一個關系模式為R(A,B,C,D),假定該關系存在著如下函數依賴:A→B,A→C,C→D,則該關系模式屬於第幾范式?為什麼?

該關系模式屬於2NF,因為鍵是A,不存在部分函數依賴。但存在非主屬性對鍵的傳遞函數依賴,故不屬於3NF

3NF

3NF的定義
    定義6.7  關系模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z(Z ∈ Y), 使得X→Y,Y→Z成立, 
    Y → X,則稱R<U,F> ∈ 3NF。
若R∈3NF,則每一個非主屬性既不部分依賴於碼也不傳遞依賴於碼。(可以證明)

定理:如果R是3NF模式,那麼R也是2NF模式。
證明:只要證明模式中局部依賴的存在蘊涵著傳遞依賴即可。設A是R的一個非主屬性,K是R的一個候選鍵,且K→A是一個局部依賴。那麼R中必存在某個K’?K,有K’→A成立。由於A是非主屬性,因此A∩KK’=φ。從K’?K,可知 K’→K,但K→K’成立。因而從K→K’ 和K’→A可知K→A是一個傳遞依賴。
局部依賴和傳遞依賴是模式產生冗余和異常的兩個重要原因。由於3NF模式中不存在非主屬性對候選鍵的局部依賴和傳遞依賴,因此消除了很大一部分存儲異常,具有較好的性能。

3NF還有下面一個等價的定義,如下所述。
定義6.7.1 設F是關系模式R的FD集,如果對F中每個非平凡的FD X→Y,都有X含有碼,或者Y的每個屬性都是主屬性,那麼稱R是3NF的模式。
這個定義表明,如果非平凡的FD X→Y中Y是主屬性,則X→Y不違反3NF條件;如果Y是非主屬性,且X不含有碼,則必存在著候選碼W有W→X,此時就有W→Y是一個傳遞依賴,即R不是3NF模式。

例:2NF關系模式S-L(Sno, Sdept, Sloc)中
函數依賴:
          Sno→Sdept
          Sdept → Sno
          Sdept→Sloc
          可得:          
         Sno→Sloc,即S-L中存在非主屬性對碼的傳遞函數依
         賴,S-L ∈ 3NF

將一個2NF的關系分解為多個3NF的關系,可以在一定程度上解決原2NF關系中存在的插入異常、刪除異常、數據冗余度大、修改復雜等問題。

將一個2NF關系分解為多個3NF的關系後,仍然不能完全消除關系模式中的各種異常情況和數據冗余。
分解成3NF模式集的算法
設關系模式R(U),主鍵是W,R上還存在FD X→Z。並且Z是非主屬性,Z?X,X不是候選鍵,這樣W→Z就是一個傳遞依賴。此時應把R分解成兩個模式:
R1(XZ),主鍵是X;
R2(Y),其中Y=U-Z,主鍵仍是W,
外鍵是X(REFERENCES R1)。利用外鍵和主鍵相匹配機制,R1和R2通過連接可以重新得到R。
如果R1和R2還不是3NF,則重復上述過程,一直到數據庫模式中每一個關系模式都是3NF為止。

綜合實例

設有關系模式R(職工名,項目名,項目費,部門名,部門經理),如果規定每個職工可以參加多個項目,每參加一個項目,就有一份項目費;每個項目只屬於一個部門管理;每個部門只有一個經理。
給出關系模式R的基本函數依賴FD和候選鍵。
R的基本FD有3個:
(職工名,項目名)→項目費
項目名→部門名
部門名→部門經理
關系模式 R 的候選鍵為:(職工名,項目名)
R是否為2NF 模式?若不是,把R分解成2NF模式集。
R中有下面兩個FD:
(職工名,項目名)→(部門名,部門經理)
項目名→(部門名,部門經理)
因為存在非主屬性組(部門名,部門經理)對候選鍵(職工名,項目名)的局部函數依賴,所以R不是2NF。 R應分解成下列兩個模式:
R1(職工名,項目名,項目費) R2(項目名,部門名,部門經理) R1與R2均為2NF。
R1,R2是否為3NF 模式?若不是,將其分解成3NF模式集。
R1已經是3NF。
在R2中存在非主屬性‘部門經理’對候選鍵‘項目名’的傳遞函數依賴,所以R不是3NF。 R2應進一步分解成下列兩個模式:
R21(項目名,部門名) R22(部門名,部門經理)
R21與R22均為3NF。最終,R分解成{R1,R21,R22}。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved