1NF
- 每個屬性都不可再分。即每個列不可再分。 1NF是所有關係型資料庫的最基本要求。
2NF
- 2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函式依賴。 出現的概念:非主屬性,碼,部分函式依賴。
函式依賴
- 簡單來說,就是通過
x
可以唯一的確定y
,比如身份證號可以唯一的確定人名。 那麼,就稱x函式確定y或y函式依賴於x。記作x→y
。 x
稱為這個函式依賴的決定屬性組,也稱為決定因素。- 若 x→y,y→x,則記作 x←→y。 若y函式不依賴於x,則記作
平凡函式依賴於非平凡函式依賴
-
若 x→y ,但
y
不是x
的子集,則稱 x→y 是非平凡的函式依賴。 若 x→y ,但y
是x
的子集,則稱 x→y 是平凡的函式依賴。 -
例子,以學生學號
sno
,課程編號cno
,學生課程成績grade
為例。- 非平凡函式依賴:(sno, cno) → grade
- 平凡函式依賴:(sno, cno) → sno (sno, cno) → cno
完全函式依賴與部分函式依賴
完全函式依賴
- 若 x → y,且 x 的任何一個真子集 x',都不可能 x' → y,則稱 y 對 x 完全函式依賴。 記作
- 比如通過學生學號
sno
,課程編號cno
可以確定學生該課程的成績grade
。 但無法從(sno, cno)的任何真子集中如sno
確定學生某一課程的成績。則稱grade
對(sno, cno)完全函式依賴。
部分函式依賴
- 若 x → y,但 y 不完全函式依賴於 x,則稱 y 對 x 部分函式依賴。 記作
- 比如身份證號碼
id
和手機號碼phone
可以確定姓名name
。 但存在存在id → name
,即部分函式依賴。
傳遞函式依賴與直接依賴
傳遞函式依賴
- 若 x → y,y → z。(y 不是 x 的子集,且不存在 y → x)
- 如學號
sno
→ 系名dept_name
, 系名dept_name
→ 系主任dept_manager_name
。 且dept_name
不是 →sno
,不是sno
的子集。所以dept_manager_name
傳遞函式依賴於sno
。
直接依賴
- 若 x → y,y → z。且 y → x,即 y ←→ x。 則 z 直接依賴為 x。
碼
- 若 則稱k為候選碼(Candidate Key)。若候選碼多於一個,則選定其中一個作為主碼(Primary Key,主鍵)。
- 如身份證號碼
id
、學號sno
都能確定學生的姓名sname
,如下表。 那麼id
、sno
為碼。若選擇id
為主鍵,即主碼。
id | sno | sname |
---|---|---|
主屬性與非主屬性
- 包含在任何一個候選碼中的屬性,稱為主屬性。 不包含在任何碼中的屬性稱為非主屬性。
- 如下表。顯然(cno, sno)為主碼,即 cno、sno 為主屬性。 而 grade 為非主屬性。
cno(課程號) | sno(學號) | grade(學生課程成績) |
---|---|---|
全碼
- 整個屬性組是碼,稱為全碼(All-key)
外碼
- 即外來鍵
2NF
- 回到定義上來:2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函式依賴。
- 首先想想主屬性對於碼的函式依賴是什麼,如(a,b)是主鍵,那a部分函式依賴於(a,b)。這種關係不用消除。
例子
- 非主屬性對於碼的部分函式依賴,如下表。sdept 可以通過 sno 來確定,且 sdept 是非主屬性,這就叫存在非主屬性的部分函式依賴。
這種關係很明顯會導致資料冗餘。如一個學生選了多門課程,每門課程都對應一行記錄,每行記錄都要去儲存重複的
sdept
。
cno(課程號) | sno(學號) | grade(學生課程成績) | sdept(學生系名) |
---|---|---|---|
- 2NF就是消除下圖中的虛線。
符合2NF的設計
cno(課程號) | sno(學號) | grade(學生課程成績) |
---|---|---|
sno(學號) | sdept(學生系名) |
---|---|
3NF
- 3NF在2NF的基礎上,消除了非主屬性對於碼的傳遞函式依賴。
例子
- 如下表,
sno
是碼,sno → sdept,sdept → sloc,且符合傳遞依賴的定義,所以 sloc 傳遞依賴於 sno。 - 這種情況,同樣會造成資料的大量冗餘,由於同一個系的學生的地址是一樣的。
sno(學號) | sdept(學生系名) | sloc(學生宿舍地址,同一個系的學生一個地址) |
---|---|---|
符合3NF的設計
sno(學號) | sdept(學生系名) |
---|---|
sdept(學生系名) | sloc(學生宿舍地址,同一個系的學生一個地址) |
---|---|