關系數據理論
寫在前面,???∈?符號的區分:
?:包含於
?:包含於或等於
?:不包含於或等於
∈:屬於 ?:不屬於
?和∈的區別:"包含於"用於說明集合與集合之間的關系,"屬於"用於說明集合與元素之間的關系。
什麽是好的關系模式(表結構)?
不好的關系模式會有什麽問題?
怎樣把不好的關系模式轉化為好的?
這就是下面要學的──關系數據庫的規範化理論
本節要點:
- 函數依賴
- 碼
- 範式
- 1NF
- 2NF
- 3NF
首先看4個定義。
1 函數依賴
定義1: 設R(U)是一個屬性集U上的關系模式,X和Y是U的子集。若對於R(U)的任意一個可能的關系r,r中對於X的每一個具體值,Y都有唯一的具體值與之對應, 則稱 “X
X稱為這個函數依賴的決定屬性集。
等價定義:r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等
示例: Student(Sno, Sname, Ssex, Sage, Sdept)
則有:
Sno → Sname , Sno → Ssex,
Sno → Sage , Sno → Sdept,
但Ssex Sage
介紹一些術語:
若X→Y,並且Y→X, 則記為X←→Y。
若Y不函數依賴於X, 則記為X Y。
若 X→Y,則X稱為這個函數依賴的決定屬性組,也稱為決定因素。
若X→Y,但Y í X, 則稱X →Y是非平凡的函數依賴
若X→Y,但Y ? X, 則稱X→Y是平凡的函數依賴。對於任一關系模式,平凡函數依賴都是必然成立的,若不特別聲明,總是討論非平凡的函數依賴。
示例:在關系SC(Sno, Cno, Grade)中
平凡函數依賴: Sno → Sno
(Sno, Cno) → Sno
(Sno, Cno) → Cno
非平凡函數依賴: (Sno, Cno) → Grade
定義2:設X,Y是關系R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X’都有X’!→Y,則稱Y完全函數依賴於X。若存在X’→Y,則稱Y部分函數依賴於X。
示例:學生成績表中(學號,課程號)→成績是完全函數依賴,(學號,課程號)→學生所在系
定義3:設X,Y,Z是關系R中互不相同的屬性集合,存在X→Y(Y!→X),Y→Z,則稱Z傳遞函數依賴於X。
註:如果Y→X,即X←→Y,則Z直接依賴於X。
示例:在關系R(學號 ,宿舍, 費用)中,(學號)->(宿舍),宿舍!=學號,(宿舍)->(費用),費用!=宿舍,所以符合傳遞函數的要求。
2 碼
第二章關於候選碼(Candidate key)的定義:若關系中的某一屬性組的值能唯一地標識一個元組,則稱該屬性組為候選碼,候選碼簡稱為碼。
定義4:設K為關系模式R<U,F>中的屬性或屬性組合。若U對K完全依賴,則K為R的候選碼。若關系某事R有多個候選碼,則選定其中一個為主碼(Primary key)。
主屬性與非主屬性:包含在任何一個候選碼中的屬性稱為主屬性,不包含在任何碼中的屬性稱為非主屬性。
全碼(All Key):一個關系中所有屬性的組合為碼,稱為全碼。
然後研究數據庫的規範化。
3 範式
關系數據庫中的關系是要滿足一定要求的,滿足不同程度要求的為不同範式。滿足最低要求的叫第一範式,簡稱1NF。在第一範式中滿足進一步要求的為第二範式,其余以此類推。
範式的種類:(這裏僅學習前三種)
第一範式(1NF)
第二範式(2NF)
第三範式(3NF)
BC範式(BCNF)
第四範式(4NF)
第五範式(5NF)
各範式之間的關系:5NF?4NF?3NF ?2NF ?1NF。
3.1 1NF
定義5:如果一個關系模式R的所有屬性都是不可分的基本數據項,則R∈1NF。
回憶關系的性質:
① 列是同質的
② 不同的列可出自同一個域
③ 列的順序無所謂
④ 任意兩個元組不能完全相同
⑤ 行的順序無所謂
⑥ 分量必須取原子值
如下面關系中,一個學生需要學習多門課程,所以一個屬性裏面包含多個值,不符合“⑥分量必須取原子值”的性質。所以不滿足1NF。
關系模式:SCG(SNO, SNAME, SAGE, CNO, GRADE)
改成下面樣式,使關系滿足1NF:
3.2 2NF
上面滿足1NF的關系可能存在的問題:
1.數據冗余:賀小華學生的基本信息進行了多次保存
2.修改困難:如果想修改“賀小華”為“賀大華”則需要更改4次,而且要保證沒有遺漏
3.插入和刪除異常--該插入的不能插,不該刪的刪了:當前關系是以學號和課程號作為主碼,那麽如果僅僅只想插入一條學生信息就不能實現,因為沒有課號信息。
那麽怎麽才能規避這些問題呢?
分析上述關系的函數依賴。
關系模式:SCG(SNO, SNAME, SAGE, CNO, GRADE)
函數依賴包括:
GRADE對(SNO, CNO)完全函數依賴
SNAME 依賴於SNO
SNAME對(SNO, CNO)部分函數依賴
同樣SAGE依賴於SNO
SAGE對(SNO, CNO)部分函數依賴
分析上面的例子,可以發現問題在於有兩種非主屬性。一種如GRADE,它對碼是完全函數依賴。另一種如SNAME,SAGE對碼不是完全函數依賴。所以解決1NF這些問題就是使所有非主屬性完全依賴於碼。
定義6:若關系模式R∈1NF,並且每一個非主屬性都完全函數依賴於R的 碼,則R∈2NF。(2NF也就是不允許關系模式存在非主屬性對碼的部分函數依賴)
所以SCG(SNO, SNAME, SAGE, CNO, GRADE)不屬於2NF。
解決辦法:
SCG分解為兩個關系模式
S(SNO, SNAME, SAGE)
SC(SNO, CNO, GRADE)
S: SNO→SNAME SNO→SAGE
SC:(SNO, CNO) → GRADE
沒有非主屬性對碼部分函數依賴S,SC分別達到2NF,1NF的3個問題也得到解決。
3.3 3NF
有關系模式 SL(Sno, Sname, Sdept, Sloc)表示學生的信息和系地址信息。
關系如下:
Sno |
Sname |
Sdept |
Sloc |
95001 |
李勇 |
CS |
理科樓 |
95002 |
劉晨 |
CS |
理科樓 |
95003 |
王敏 |
CS |
理科樓 |
95004 |
張立 |
IS |
文科樓 |
95005 |
劉斌 |
IS |
文科樓 |
95006 |
王建國 |
IS |
文科樓 |
95007 |
王家昌 |
MA |
綜合樓 |
存在問題:
1) 數據冗余度大:每個系的地址都一樣,關於系地址的信息卻要重復存儲於該系學生人數相同的次數。
2) 修改困難:當學校調整系地址時,每個系地址的信息重復存儲,修改時必須同時更新該系所有學生的Sloc
3) 插入異常:如果某個系剛成立,目前暫時沒有在校學生,無法把系地址的信息存入數據庫。
4) 刪除異常:如果某個系的學生全部畢業了,在刪除該系學生信息的同時,把這個系的地址信息也刪除了。
問題出在哪呢?
存在非主屬性對碼的傳遞依賴:(Sloc不直接依賴於碼Sno,而是通過Sdept傳遞依賴)
Sno→Sdept
Sdept→ Sloc
Sno→ Sloc
定義7: 關系模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z, 使得X→Y,Y → Z成立,則稱R<U,F> ∈ 3NF。 (即沒有非主屬性對碼的傳遞函數依賴)
例, SL(Sno, Sname, Sdept, Sloc )∈2NF
SL(Sno, Sname, Sdept, Sloc ) ? 3NF
解決方法:
把SL分解為兩個關系模式,以消除傳遞函數依賴:
SD(Sno, Sname, Sdept)
DL(Sdept, Sloc)
SD的碼為Sno,DL的碼為Sdept。非主屬性直接依賴於碼,是3NF,2NF存在的幾個問題得到解決。
若R∈3NF,則R的每一個非主屬性,既不部分函數依賴於碼,也不傳遞函數依賴於碼。
關系數據理論