1.第一范式(1NF)
第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
下面看例子-学生信息表,
每一个属性都只有一个值,比如属性-电话,每个电话字段只有一个值,每一条记录里,每一个属性只有一个值而且不会有两个。
每一个字段也不能重复,下面是 符合的这一条规则的数据表,没有相同重复的字段(Field)
而下面的表显然就不符合第一范式,因为DBMS不允许将一个字段再分,数据表中的字段都是单一的,不可再分的。
如果需要重复的属性,那就可能需要定义一个新的实体,例如,学生信息表,一个人可能有一部家庭电话和一部移动电话,这时将其规范化为1NF可以将电话号码分为“家庭电话”和“移动电话”两个属性,即学生(学号,姓名,家庭电话,移动电话)。
简而言之,第一范式就是无重复的列
2.第二范式(2NF)
第二范式是在第一范式的基础上建立的,即满足第二范式首先要先满足第一范式。
在满足第一范式的前提下,
一是表必须有一个主键;
在学生信息表里,姓名可能会有重复相同的,所以为了能够明显地区别哪个学生是哪个学生,加上学号为主键,唯一标识该元组也就是标识该记录,
二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
例如,
在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),
但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题。
解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外关键字课程号联系,在需要时进行连接。
所以,所有单关键字的数据表都属于第二范式,因为不存在组合关键字,也就不存在部分函数依赖。
3.第三范式(3NF)
第三范式是在第二范式的基础上建立的,即满足第三范式首先要先满足第二范式。
第三范式是在第二范式的前提下,消除非主属性的传递函数依赖。
以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,
所以该表有两个候选码(学号,课程号)和(姓名,课程号),
故存在函数依赖:
学号——>姓名
(学号,课程号)——>成绩
唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。
假设有一个关系,R(ABCDE), F={AB→CE,E→AB,C→D},候选码为AB,E.
AB→C,C→D → AB→D
存在非主属性D对候选键的传递函数依赖
E→AB,AB→C → E→C
存在非主属性C对候选键的传递函数依赖
4.BCNF范式(BCNF)
它构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。
参考资料:
https://blog.csdn.net/qingking520/article/details/52937728
<https://blog.csdn.net/qingking520/article/details/52937728>
https://blog.csdn.net/dove_knowledge/article/details/71434960
<https://blog.csdn.net/dove_knowledge/article/details/71434960>
https://blog.csdn.net/w__yi/article/details/19934319
<https://blog.csdn.net/w__yi/article/details/19934319>
热门工具 换一换