Third Normal Form(第三正規化)
阿新 • • 發佈:2018-12-16
Third Normal Form(第三正規化)
如果一個relation滿足第三正規化,那麼它:
- 滿足第二正規化
- 不存在
transitive dependency
(傳遞依賴)
在前面將 第二正規化的時候,我們建了3張表,回顧一下。
Student Table
student_id | name | reg_no | branch | address |
---|---|---|---|---|
10 | Akon | 07-WY | CSE | Kerala |
11 | Akon | 08-WY | IT | Gujarat |
12 | Bkon | 09-WY | IT | Rajasthan |
Subject Table
subject_id | subject_name | teacher |
---|---|---|
1 | Java | Java Teacher |
2 | C++ | C++ Teacher |
3 | Php | Php Teacher |
Score Table
score_id | student_id | subject_id | marks |
---|---|---|---|
1 | 10 | 1 | 70 |
2 | 10 | 2 | 75 |
3 | 11 | 1 | 80 |
score_id | student_id | subject_id | marks | exam_name | total_marks |
---|---|---|---|---|---|
修改後,exam_name
欄位還是依賴於主鍵(student_id,subject_id)
的,畢竟不同專業的學生會有不一樣的考試,相同專業的不同考生也有不一樣的考試嘛。
可是total_mark
就不太一樣了。因為不同考試的算分策略不一樣,有的是平時成績和考試成績三七開,有的四六開,所以total_marks
是取決於exam_name
的,但是這張表的主鍵又是(student_id,subject_id)
,這樣transitive dependency(傳遞依賴)
的定義也就來了:
Transitive Dependency
: When anon-key attribute
depends on othernon-key attributes
rather than depending upon thekey attributes
orprimary key
.
也就是說,一個非碼的屬性依賴於另一個(或幾個)非碼屬性,這樣的依賴就成為傳遞依賴。也就如Score表中的total_marks
是取決於exam_name
的,而主碼是(student_id,subject_id)
怎麼消除傳遞依賴?
把傳遞依賴的那幾列單獨放到另一張表去,再設定一個新的列來代替Score表中關於考試的資訊。
The new Score Table
score_id | student_id | subject_id | marks | exam_id |
---|---|---|---|---|
The new Exam table
exam_id | exam_name | total_marks |
---|---|---|
1 | Workshop | 200 |
2 | Mains | 70 |
3 | Practicals | 30 |