目录
1、1NF
2、2NF
3、3NF
4、BCNF
5、4NF
1、1NF
在实际应用中,数据库表的每一列(也称为属性)都是不可分割的原子数据项,不能是集合,数组,记录等非原子数据项。即在实际应用中实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。
比如存在数据表(学号、学生姓名、家庭详细地址)。在该关系表中家庭地址就要按照实际情况进行处理。如果要求学生所在的省市区域,那家庭地址这个字段不符合第一范式,要进行细分,也即数据表(学号、学生姓名、省市区域、家庭详细地址)。如数据(ml,361909020429,宁夏,固原西吉.....)。因此是否满足第一范式要求要看该关系数据表是否满足实际的应用场景。
2、2NF
在1NF基础上,每一个的非码属性(不在主键中的列),都必须完全函数依赖于候选码。(在1NF基础上,消除 非码属性对码的部分函数依赖,也就是让非码属性 函数依赖于候选码中的全部属性)。
比如关系表(学号,课程编号,课程名称,姓名, 年龄, 成绩, 学分)。实际上,在该关系表中姓名、年龄属性只依赖于学号,而与课程编号没有任何关系,所以这就是部分函数依赖,不是完全函数依赖。因此不满足第二范式的要求,将上述表进行拆分,消除函数依赖。
学生(学号,姓名, 年龄)
课程(课程编号,课程名称,学分)
成绩(学号,课程编号,成绩)
3、3NF
在2NF基础上,任何非主属性都直接依赖于主属性,不能传递依赖于主属性。即 表中的每一列 只与主键直接相关,而不是间接相关,(表中的每一列只能依赖于主键)。即每一个非码属性既不部分依赖于码,也不传递依赖于码。
比如关系表(学号,学生姓名,性别,学院编号,学院电话),很明显有关系 学号——>学院编号——>学院电话,这就是典型的传递函数依赖。因此对表进行拆分消除传递函数依赖如下。
学生(学号,学生姓名,性别,学院编号)
学院(学院编号,学院电话)
4、BCNF
在3NF基础上,消除主属性(候选码中的属性)对候选码的部分函数依赖和传递函数依赖。
若R∈BCNF,按定义排除了任何属性对码的传递依赖与部分依赖,所以R∈3NF。
3NF:即每一个非码属性既不部分依赖于码,也不传递依赖于码
BCNF:排除了任何属性对码的传递依赖与部分依赖(相对于3NF范围更广,从非码属性扩展到任何属性)
比如存在关系表(仓库编号,商品编号,管理员编号,数量),其中假设在该关系表中一个仓库只有一个一个管理员,所以管理员编号——>仓库编号,而仓库编号——>管理员编号,同时(仓库编号,商品编号)——>数量,(管理员编号,商品编号)——>数量,即再该关系中存在两个候选关键字(仓库编号,商品编号)和(管理员编号,商品编号),所以符合第三范式的定义,非码属性既不部分依赖于码,也不传递依赖于码。
可是存在的问题是,候选码(管理员编号,商品编号)中的主属性(管理员编号)部分依赖于不包含它的候选键(仓库编号,商品编号),所以不符合BCNF范式。因此对上面的关系进行拆分消除部分函数依赖关系如下。
(仓库编号,管理员编号)
(仓库编号,商品编号,数量)
5、4NF
多值依赖是属性之间的一对多关系,记为K→→A。
函数依赖事实上是单值依赖,所以不能表达属性值之间的一对多关系。
平凡的多值依赖:全集U=K+A,一个K可以对应于多个A,即K→→A。此时整个表就是一组一对多关系。
非平凡的多值依赖:全集U=K+A+B,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。
在BCNF的基础上,消除非平凡且非函数依赖的多值依赖。4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。4NF所允许的多值依赖实际上是函数依赖。
比如下面的一张表,很明显存在多值依赖关系
课程→学生
课程→先修课
所以对上面的表进行拆分消除多值依赖如下
————————————————
点击进入连接:上述文章参考该博主的优秀博文