設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的外部碼
主碼與外部碼一起提供了表示關系間聯系的手段
范式是符合某一種級別的關系模式的集合
關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式
范式的種類:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF)
第四范式(4NF)
第五范式(5NF)
各種范式之間存在聯系:
某一關系模式R為第n范式,可簡記為R∈nNF。
一個低一級范式的關系模式,通過模式分解可以轉換為若干個高一級范式的關系模式的集合,這種過程就叫規范化
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的定義
定義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}。