Third Normal Form(第三范式)

本文深入探讨了数据库设计中的第三范式(ThirdNormalForm)概念,通过实例讲解了如何识别和消除传递依赖,确保数据表结构的合理性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Third Normal Form(第三范式)

如果一个relation满足第三范式,那么它:

  • 满足第二范式
  • 不存在transitive dependency(传递依赖)

在前面将 第二范式的时候,我们建了3张表,回顾一下。
Student Table
student_idnamereg_nobranchaddress
10Akon07-WYCSEKerala
11Akon08-WYITGujarat
12Bkon09-WYITRajasthan
Subject Table
subject_idsubject_nameteacher
1JavaJava Teacher
2C++C++ Teacher
3PhpPhp Teacher
Score Table
score_idstudent_idsubject_idmarks
110170
210275
311180
现在我想在Score表里面多加一点信息,说明一下,原来Score表中的marks我们看作是平时成绩,现在附加上`exam_name`和`total_marks`两个字段。
score_idstudent_idsubject_idmarksexam_nametotal_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_idstudent_idsubject_idmarksexam_id
The new Exam table
exam_idexam_nametotal_marks
1Workshop200
2Mains70
3Practicals30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值