資料庫三正規化

roran發表於2020-04-05

1NF

  • 每個屬性都不可再分。即每個列不可再分。 1NF是所有關係型資料庫的最基本要求。
    71900-0hxmegxcav4i.png

2NF

  • 2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函式依賴。 出現的概念:非主屬性,碼,部分函式依賴。

函式依賴

  • 簡單來說,就是通過x可以唯一的確定y,比如身份證號可以唯一的確定人名。 那麼,就稱x函式確定yy函式依賴於x。記作 x→y
  • x稱為這個函式依賴的決定屬性組,也稱為決定因素。
  • 若 x→y,y→x,則記作 x←→y。 若y函式不依賴於x,則記作
    30594-6szm5vjrpmr.png

平凡函式依賴於非平凡函式依賴

  • 若 x→y ,但y不是x的子集,則稱 x→y 是非平凡的函式依賴。 若 x→y ,但yx的子集,則稱 x→y 是平凡的函式依賴。

  • 例子,以學生學號sno,課程編號cno,學生課程成績grade為例。

    • 非平凡函式依賴:(sno, cno) → grade
    • 平凡函式依賴:(sno, cno) → sno (sno, cno) → cno

完全函式依賴與部分函式依賴

完全函式依賴
  • 若 x → y,且 x 的任何一個真子集 x',都不可能 x' → y,則稱 y 對 x 完全函式依賴。 記作
    43467-2nkh3lzxudw.png
  • 比如通過學生學號sno,課程編號cno可以確定學生該課程的成績grade。 但無法從(sno, cno)的任何真子集中如sno確定學生某一課程的成績。則稱grade對(sno, cno)完全函式依賴。
部分函式依賴
  • 若 x → y,但 y 不完全函式依賴於 x,則稱 y 對 x 部分函式依賴。 記作
    37159-9yhqdmuwbcq.png
  • 比如身份證號碼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。

  • 94875-7l5cc08ccai.png
    則稱k為候選碼(Candidate Key)。若候選碼多於一個,則選定其中一個作為主碼(Primary Key,主鍵)。
  • 如身份證號碼id、學號sno都能確定學生的姓名sname,如下表。 那麼idsno為碼。若選擇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就是消除下圖中的虛線。
    54621-wrcc0zqi8xn.png

符合2NF的設計

cno(課程號) sno(學號) grade(學生課程成績)

sno(學號) sdept(學生系名)

3NF

  • 3NF在2NF的基礎上,消除了非主屬性對於碼的傳遞函式依賴。

例子

  • 如下表,sno是碼,sno → sdept,sdept → sloc,且符合傳遞依賴的定義,所以 sloc 傳遞依賴於 sno。
  • 這種情況,同樣會造成資料的大量冗餘,由於同一個系的學生的地址是一樣的。
sno(學號) sdept(學生系名) sloc(學生宿舍地址,同一個系的學生一個地址)

35734-3uvwrtuwnjp.png

符合3NF的設計

sno(學號) sdept(學生系名)

sdept(學生系名) sloc(學生宿舍地址,同一個系的學生一個地址)

相關文章