【SQL必知必会学习笔记】数据库的设计范式都有哪些?数据表的键都有哪些?

目前关系型数据库一共有 6 种范式,按照范式级别,从低到高分别是:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(巴斯 - 科德范式)、4NF(第四范式)和 5NF(第五范式,又叫做完美范式)。

【SQL必知必会学习笔记】数据库的设计范式都有哪些?数据表的键都有哪些?

数据表中常用的几种键:

超键:能唯一标识元组的属性集叫做超键。

候选键:如果超键不包括多余的属性,那么这个超键就是候选键。

主键:用户可以从候选键中选择一个作为主键。

外键:如果数据表 R1 中的某属性集不是 R1 的主键,而是另一个数据表 R2 的主键,那么这个属性集就是数据表 R1 的外键。

主属性:包含在任一候选键中的属性称为主属性。

非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性。

1NF 指的是数据库表中的任何属性都是原子性的,不可再分;

2NF 指的数据表里的非主属性都要和这个数据表的候选键有完全依赖关系。

举一个没有满足 2NF 的例子,比如说我们设计一张球员比赛表 player_game,里面包含球员编号、姓名、年龄、比赛编号、比赛时间和比赛场地等属性,这里候选键和主键都为(球员编号,比赛编号),我们可以通过候选键来决定如下的关系:(球员编号, 比赛编号) → (姓名, 年龄, 比赛时间, 比赛场地,得分)上面这个关系说明球员编号和比赛编号的组合决定了球员的姓名、年龄、比赛时间、比赛地点和该比赛的得分数据。但是这个数据表不满足第二范式,因为数据表中的字段之间还存在着如下的对应关系:(球员编号) → (姓名,年龄)(比赛编号) → (比赛时间, 比赛场地)也就是说候选键中的某个字段决定了非主属性。你也可以理解为,对于非主属性来说,并非完全依赖候选键。

这样会产生怎样的问题呢?

数据冗余:如果一个球员可以参加 m 场比赛,那么球员的姓名和年龄就重复了 m-1 次。一个比赛也可能会有 n 个球员参加,比赛的时间和地点就重复了 n-1 次。

插入异常:如果我们想要添加一场新的比赛,但是这时还没有确定参加的球员都有谁,那么就没法插入。

删除异常:如果我要删除某个球员编号,如果没有单独保存比赛表的话,就会同时把比赛信息删除掉。

更新异常:如果我们调整了某个比赛的时间,那么数据表中所有这个比赛的时间都需要进行调整,否则就会出现一场比赛时间不同的情况。

3NF 在满足 2NF 的同时,对任何非主属性都不传递依赖于候选键。也就是说不能存在非主属性 A 依赖于非主属性 B,非主属性 B 依赖于候选键的情况。

用球员 player 表举例子,这张表包含的属性包括球员编号、姓名、球队名称和球队主教练。现在,我们把属性之间的依赖关系画出来,如下图所示:

【SQL必知必会学习笔记】数据库的设计范式都有哪些?数据表的键都有哪些?

你能看到球员编号决定了球队名称,同时球队名称决定了球队主教练,非主属性球队主教练就会传递依赖于球员编号,因此不符合 3NF 的要求。

如果要达到 3NF 的要求,需要把数据表拆成下面这样:球员表的属性包括球员编号、姓名和球队名称;球队表的属性包括球队名称、球队主教练。