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 --> teacher
的functional 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。