Mysql六大范式

一、数据库范式

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

你可能感兴趣的:(Mysql六大范式)