文章目录
怎么消除传递依赖?
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 |