Third Normal Form(第三范式)

版权声明:本文为博主原创文章,如需转载,请注明出处。 https://blog.csdn.net/qq_37174526/article/details/84107958

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

猜你喜欢

转载自blog.csdn.net/qq_37174526/article/details/84107958