1. 程式人生 > >Second Normal Form(2NF)

Second Normal Form(2NF)

什麼是第二正規化?

一個relation如果滿足第二正規化,那麼它必定:

  • 滿足第一正規化
  • 不存在partial dependency(部分依賴)

那什麼又是partial dependency呢?別急,我們慢慢道來。


什麼是dependency(依賴)?

假設我們有一張Student表,該表包含以下欄位student_id, name, reg_no(註冊號), branch(專業) 和address(家庭住址)。我們都知道,student_id可以唯一地決定一條學生記錄,那麼student_id可以做主鍵。

student_id name reg_no branch address
10 Akon 07-WY CSE Kerala
10 Akon 08-WY IT Gujarat

那麼,如果我已經知道了student_id,那我也就知道了他的branch、name等等資訊,換句說就是student_id 決定了branch,也決定了name,像這種誰某一列(或多列)決定了其它列(或多列),我們就成之為依賴,也有的地方稱為functional dependency

(函式依賴)。


## 什麼是 partial dependency(部分依賴)?

假設我們現在有個表Subject,包含subject_id,subject_name

subject_id subject_name
1 Java
2 C++
3 Python

又有一張新的Score表,包含score_id,student_id,subject_id,marks,marks欄位

score_id student_id subject_id marks teacher
1 10 1 70 Java Teacher
2 10 2 75 C++ Teacher
3 11 1 80 Java Teacher

對於Score表來說,student_id + subject_id是該表的candidate Key(候選碼),我們就選這個候選碼作為主碼。

好的,那麼看一下teacher這個欄位,它的依賴關係應該是,一個課程決定了該課程的老師是誰,也就是說,存在subject_id --> teacherfunctional dependency,但是這個函式依賴的決定因素subject_id只是主鍵的一部分,並且和主鍵中的student_id沒什麼關係,像這樣的,我們依賴稱之為partial dependency部分依賴。

怎麼消除部分依賴?

很簡單,只要把存在部分依賴的那一列元素單獨拉出來就OK。

在上面的Score表中,我們把teacher列拉出來,剛好它是依賴於subject_id的嘛,所以,就把teacher列拉到Score表中去。操作之後就像下面這樣:

subject_id subject_name teacher
1 Java Java Teacher
2 C++ C++ Teacher
3 Php Php Teacher
score_id student_id subject_id marks
1 10 1 70
2 10 2 75
3 11 1 80

so easy。