1. 程式人生 > >Third Normal Form(第三正規化)

Third Normal Form(第三正規化)

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表裡面多加一點資訊,說明一下,原來Score表中的marks我們看作是平時成績,現在附加上`exam_name`和`total_marks`兩個欄位。
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 a non-key attribute depends on other non-key attributes rather than depending upon the key attributes or primary 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