一、数据库范式
1、第一范式(1NF)
数据库表中的字段都是单一属性的,即属性应该是不可再分的。这是关系型数据库的基本要求。
比如说属性地址,可以继续拆分成多个属性省、市、镇、街道、门牌号…
但仅仅符合1NF的设计,仍然会存在数据冗余过大,插入异常,删除异常,修改异常的问题。
2、第二范式(2NF)
在第一范式的基础上,消除非主属性对候选键的部分依赖。对于候选键只有一个属性的数据库表,其一定符合第二范式。
函数依赖:若在一张表中,在属性X确定的情况下,必定能确定属性Y的值,也就是说在一张表中,不存在任意两条属性,他们属性X的值相同,但属性Y的值不同。
那么就可以说Y函数依赖于X,写作X->Y。
函数依赖分为完全函数依赖、部分函数依赖、传递函数依赖。
码:
假设K为某个表中的一个属性或者属性组,若除K之外的所有属性都完全函数依赖于K,那么我们称K为候选码,简称码。通常理解为:假如当K确定的情况下,该表除K之外的所有属性的值也就随之确定,那么K就是码。一张表中可以有超过一个码。实际中为了方便,通常选择其中一个作为主码。
非主属性:
包含在任何一个码中的属性称为主属性,其余称为非主属性。
判断是否符合2NF的方法是:
第一步:找出数据表中所有的码。
第二步:根据第一步所得到的码,找出所有的主属性。
第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
第四步:查看是否存在非主属性对码的部分函数依赖。
为了达到2NF的要求,必须消除找到的这些部分函数依赖,只有一个办法,就是将大数据表拆分成两个或者更多个更小的数据表,在拆分的过程中,要达到更高一级范式的要求,这个过程叫做”模式分解“。
比如:
学生-课程表(学号,姓名,性别,课程名,学分)
可知存在如下函数依赖:
(学号,课程名)->(姓名,性别,学分)
(学号)->(姓名,性别)
(课程名)->(学分)
五个属性均不可再分,满足1NF,由2,3可知存在非主属性对候选键((学号,课程名))的的部分依赖,所以上述表结构不满足2NF,我们可以改造成以下三个表来满足2NF:
学生表(学号,姓名,性别)
课程表(课程号,课程名,学分)
学生-课程表(学号,课程号)
2NF仍然会存在删除和插入错误、部分数据冗余。
3,第三范式(3NF)
在第二范式的基础上,消除非主属性对于码(候选码)的传递依赖。
比如:
学生表(学号,姓名,班级名,班主任)
可知存在如下依赖:
(学号)->(姓名,班级名,班主任)
(学号)->(班级名)
(班级名)->(班主任)
因为主键是单列键,显然,满足2NF,又由2,3可知存在(学号)->(班主任)的传递依赖,所以不满足3NF,可以改造为如下两个表使之符合3NF:
学生表(学号,姓名,班级ID)
班级表(班级ID,班级名,班主任)
4、巴斯-科德范式(BCNF)
在满足第三范式的基础上,消除主属性对于候选键的部分函数依赖和传递函数依赖。
比如:
仓库(仓库名,管理员,物品名,数量)(仓库指定由唯一管理员管理,管理员管理唯一仓库)
可知存在如下依赖:
(仓库名,物品名)->(数量)
(管理员,物品名)->(数量)
(管理员)->(仓库名)
(仓库名)->(管理员)
可知,这里只有一个非主属性,即“数量”,且不存在非主属性对两个候选键的部分与传递函数依赖。所以以上表关系满足3NF。但存在着主属性对两个候选键的部分函数依赖,这会导致插入异常、删除异常、修改异常的存在,比如:
插入异常,不能插入一个空仓库(作为主属性的“物品名”不能为空);
删除异常,删除某个仓库内所有物品后,会一并将仓库的管理员信息删除;
修改异常,修改仓库的管理员信息,不得不进行批量修改,同理修改物品名、仓库名时也不得不批量修改。
可以改造如下两个表结构,使之符合BCNF:
仓库(仓库名,管理员)
仓储(仓库名,物品名,数量)
5、第四范式(4NF)
在BC范式的基础上,消除属性间非平凡且非函数依赖的多值依赖,这里提的多值依赖于之前的函数依赖不同。多值依赖标识属性间的一种依赖关系,比如有属性X、Y、Z,对于X的每个值,Y有一个值集,Z有一个值集,并且Y的值集合Z的值集彼此独立。
比如:
课程表(课程名,修读该课程的学生,教授该课程的教师)
上述关系满足BCNF,且可知一个课程对应N个学生的同时对应N个教师,且学生与教师是独立的,故不满足4NF,可以改造为如下的两个表结构,使之符合4NF:
学生-课程表(课程名,修读该课程的学生)
教师-课程表(课程名,教授该课程的教师)
6、第五范式(5NF)
在第四范式的基础上,消除关系中的所有冗余。5NF避免了所有的数据冗余,节省了存储空间,同时保持了数据的一致性,但是也付出了效率上的代价。在实际应用中,数据库适当的冗余其实有助于提高查询的效率,减少过多的表连接操作,所以5NF的应用少之又少。
比如:
选修课表(学生,课程,教师)(多个老师可以同时教授同一门选修课,多个学生能选修同一门选修课)
可知(学生,课程,教师)就是唯一一个候选键,所有属性都是主属性,且不满足属性间的多值依赖,故满足4NF,但是存在大量冗余,可以改造为以下三个表结构,使之符合5NF:
学生-课程表(学生,课程)
课程-教师表(课程,教师)
学生-教师表(学生,教师)
学习自:https://blog.csdn.net/qq_38309645/article/details/105051671