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>

 

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信