范式定义会使用主键和候选键(因为主键和候选键可以唯一标识元组)
-
能唯一标识元组的属性集叫做超键(身份识别的集合)
-
候选键:如果超键不包括多余的属性,那么这个超键就是候选键
-
主键:用户可以从候选键中选择一个作为主键
-
外键:如果数据表 R1 中的某属性集不是 R1 的主键,而是另一个数据表 R2 的主键,那么这个属性集就是数据表 R1 的外键
-
主属性:包含在任一候选键中的属性称为主属性
-
非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性
-
1NF(第一范式)
1NF指的是数据库表中的任何属性都是原子性的,不可再分。 -
2NF
2NF指的是数据表里的非主属性都要和这个数据表的候选键(属性的集合,可能是一个也可能是两个)有完全依赖关系。不仅仅是依赖候选键的一部分属性,而必须依赖全部属性。
例子:
player_game(球员编号,姓名,年龄,比赛编号,比赛时间,比赛场地)
这里候选键是(球员编号,比赛编号)->(姓名,年龄,比赛时间,比赛场地,得分)
但是这个表不满足二范式,因为(球员编号)->(姓名,年龄) (比赛编号)->(比赛时间,比赛场地)
也就是说候选键中的某个字段决定了非主属性。
不满足2NF的缺点:
-
数据冗余
-
插入异常
-
删除异常
-
更新异常
-
3NF
3NF在满足2NF的同时,对任何非主属性都不传递依赖于候选键。也就是非主属性A依赖于非主属性B,非主属性B依赖于候选键的情况。
例子:
plyer(球员编号,姓名,球队名称,球队教练)
其中球队名称->球队教练,因此球队教练和候选键之间是一种依赖传递
课后习题:
我们现在有一张学生选课表,包含的属性有学号、姓名、课程名称、分数、系别和系主任,如果要改成符合 3NF 要求的设计,需要怎么修改呢?
解答:
1.学生表:学号(主键),姓名,系别编号(外键)
2.课程表:课程编号(主键),课程名称
3.成绩表: 学号,课程编号,分数(学号和课程编号)
4.院系表:系别编号(主键),系别(名称),系主任