六大范式
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同规范要求被称为不同的范式,各范式呈递次规范,越高范式数据库的冗余越小。只要符合前三大范式就不会发生插入(insert)、删除(delete)和更新(update)操作异常。
- 分类:
目前关系型数据库被分为6种范式,分别为:
第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯一科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式) - 简单理解:
1NF : 列不能混着用就行了。
2NF:要有一个主键,它能决定其他列的值。
3NF:对于除了主键外的列,不存在某个列,它能决定其他列。 概念解释:
- 码:表中,通过一个属性或属性组,可以决定唯一的一条记录,那么这个属性或属性组就被称为候选码,简称码;
- 主属性:码中的所有属性(示例中的绿色背景列);
- 非主属性:除开码中属性的其他属性;
- 函数依赖:A->B,通过A属性(组)的值,可以确定唯一的B属性的值,则称B依赖于A,数学函数表示B=f(A) ;
- 码:表中,通过一个属性或属性组,可以决定唯一的一条记录,那么这个属性或属性组就被称为候选码,简称码;
解决了
关系型数据库表的建立必须满足1NF,否则就不是关系型数据库表
- 存在的问题
1.数据冗余;
2.插入异常;
- 如果需要新建一个系,并且有系主任,但是因为还没有学生,所以主键是空的,会导致无法插入
3.删除异常;
- 如果需要把某个系下面学生信息都清空,那么这个系也就不存在了
4.修改异常;
- 如果需要把学生的系进行更换,就需要把三条数据里面的系名和系主任都修改才可以。
- 仅符合1NF: | 姓名 | 系名 | 系主任 | 课名 | 分数 | | —- | —- | —- | —- | —- | | 小花 | 搬砖系 | 小花花 | 高数 | 60 | | 小花 | 搬砖系 | 小花花 | 英语 | 99 | | 小花 | 搬砖系 | 小花花 | 编程 | 99 | | 小明 | 英语系 | 小明明 | 高数 | 80 | | 小明 | 英语系 | 小明明 | 英语 | 59 | | 小明 | 英语系 | 小明明 | 编程 | 99 |
问题:非主属性 “系名” 仅仅依赖于主属性 “姓名” 而不依赖于主属性 “课名”,即存在非主属性部分依赖于码。
2NF
在1NF的基础上,非主属性必须完全依赖于码(在1NF基础上消除非主属性对码的部分函数依赖);
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
- 判断是否符合2NF
判断是否符合2NF,就是看数据表中是否存在非主属性对于码的部分函数依赖,若存在则不符合2NF,若不存在,则符合2NF。
- 解决了
1.消除非主属性对码的部分函数依赖;
2.数据冗余、修改异常
- 存在的问题
1.非主属性对码的传递依赖;
2.插入异常、删除异常
- 仅符合2NF: | 姓名 | 课名 | 分数 | | —- | —- | —- | | 小花 | 高数 | 60 | | 小花 | 英语 | 99 | | 小花 | 编程 | 99 | | 小明 | 高数 | 80 | | 小明 | 英语 | 59 | | 小明 | 编程 | 99 |
姓名 | 系名 | 系主任 |
---|---|---|
小花 | 搬砖系 | 小花花 |
小花 | 搬砖系 | 小花花 |
小花 | 搬砖系 | 小花花 |
小明 | 英语系 | 小明明 |
小明 | 英语系 | 小明明 |
小明 | 英语系 | 小明明 |
问题:非主属性 “系主任” 不直接依赖于主属性 “姓名”,它通过非主属性 “系名”传递依赖于主属性 “姓名”;
3NF
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖);
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关,即不存在传递函数依赖。
- 解决了
1.消除了非主属性对码的传递依赖;
2.数据冗余、插入异常、删除异常、修改异常
- 仅符合3NF: | 姓名 | 课名 | 分数 | | —- | —- | —- | | 小花 | 高数 | 60 | | 小花 | 英语 | 99 | | 小花 | 编程 | 99 | | 小明 | 高数 | 80 | | 小明 | 英语 | 59 | | 小明 | 编程 | 99 |
姓名 | 系名 |
---|---|
小花 | 搬砖系 |
小明 | 英语系 |
系名 | 系主任 |
---|---|
搬砖系 | 小花花 |
英语系 | 小明明 |
巴斯一科德范式
属于第三范式的修正版,在3NF基础上不允许主属性间存在依赖关系。
通常情况下,巴斯-科德范式被认为没有新的设计规范加入,只是对第二范式与第三范式中设计规范要求更强,因而被认为是修正第三范式,也就是说,它事实上是对第三范式的修正,使数据库冗余度更小。这也是BCNF不被称为第四范式的原因。
4NF
非主属性不应该有多值。如果有多值就违反了第四范式。4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。
⚠️:如果只考虑函数依赖,关系模式规范化程度最高的范式是BCNF;如果考虑多值依赖则是4NF。
5NF
第五范式属于最终范式,消除了4NF中的连接依赖