数据库规范化 - 六大范式解析

什么是范式

就如同景区评级一样,5A级景区比4A级景区更规范,要求也更多
范式就是数据库表的评级,可以理解为表结构的设计标准的级别,是关系的约束条件的规范,范式越高,表的划分越细

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF - Boyce Codd Normal Form)、第四范式(4NF)和第五范式(5NF,又称完美范式)

范式来自英文Normal Form,简称NF

范式是关系的规范,NoSql非关系型数据库没有范式


第一范式:1NF

列的原子性:每一列不可再分

例如:

数据库规范化 - 六大范式解析_第1张图片

这种表结构是不符合1NF的

1NF是关系型数据库的基本要求,创建表时不符合1NF的操作一定不成功

但很多时候是要根据系统的需求程序员自行判断1NF
例如:City属性
数据库规范化 - 六大范式解析_第2张图片

如果当前系统需要判断省、市,这个city属性就是需要再细分的


第二范式:2NF

在1NF的基础上,且每一个非主属性完全函数依赖与候选码

2NF的表,每一行数据仅可以被候选码唯一区分,也就是数据仅专注于一件事

  • 函数依赖:在表中,知道属性K,可以推出(确定)属性V,即K ->V(V函数依赖与K)
  • 完全函数依赖:若K->V,但是K的真子集无法确定V,即V完全函数依赖与K
  • 候选码:若K为表的属性/属性组,K之外的属性完全函数依赖与K,即K为表的候选码(确定了K就可以确定整个数据行),候选码可以有多个
  • 包含在候选码中的属性为主属性,不包含在候选码的是非主属性

2NF通俗来说:必须候选码中所有主属性都确定才能确定其他的非主属性

例如:一个student表
数据库规范化 - 六大范式解析_第3张图片

假设候选码是id,classId,通过这两个属性可以确定数据行

但是通过id可以确定name和addres,通过classId可以确定score,仅符合1NF,不符合2NF

这样的表结构操作数据会出现什么问题?

  • 数据冗余:同一个student会有多门课程,即id,name,address会大量冗余
  • 插入异常:插入一个刚入学的学生数据,没有课程成绩,classId,score为空,如果设置了非空就插入异常了
  • 修改异常或繁琐:修改id=1对应的name(如果存在多个class),要是只修改一条数据,数据就不一致,修改全部,就很繁琐
  • 删除异常:将一个id的所有class删除,该id对应的student就没了

所有就需要2NF:

即分成两个表student、class
在这里插入图片描述

在这里插入图片描述

student表专注于学生信息,class表专注于课程成绩

这就是2NF的作用:数据表专注于一件事,不掺杂其他复杂的关系,让表更容易操作维护


第三范式:3NF

在2NF基础上,消除依赖传递,任何非主属性不依赖与其他非主属性

即每个属性都和候选码有直接关系,不存在非主属性间的相互依赖

2NF是这样的:
数据库规范化 - 六大范式解析_第4张图片

3NF在2NF的基础上禁止了

非主属性b和a之间的依赖,下面这个图不符合3NF

数据库规范化 - 六大范式解析_第5张图片

举个栗子:id是候选码,通过id可以确定数据行

在这里插入图片描述

但是通过address可以确定country,即address -> country,country函数依赖与address,符号2NF,不符合3NF

如果满足3NF就需要将表拆分成:
在这里插入图片描述

在这里插入图片描述

3NF继续细化了表结构,让表专注于一个功能


规范化的目的

规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。

实际上,数据库的设计满足3NF就基本够了,表已经细化到可以接受了

当初设计范式是为了针对数据库表的数据冗余,当一个表数据属性过多,我们仅需表中的几个数据,却查出几十列数据,这个表是不规范的

通过3NF的规范化,数据基本达到要求

需求 > 性能 > 表结构,不用为了范式而设计数据库,而是为了需求设计数据库


巴斯-科德范式:BCNF

BCNF:每一个决定因素都包含候选码,在3NF的基础上消除主属性对于候选码码的部分与传递函数依赖,BCNF被认为是扩充的第三范式

3NF里:

  • 所有的非主属性对每一个候选码都是完全函数依赖
  • 没有任何属性完全函数依赖与非主属性

但还是存在缺陷:

举个栗子:

STJ(S,T,J)表,S表示学生,T表示教师,J表示课程,每一个教师只教一门课,每门课有若干教师,某个学生选定某门课就对应一个教师

其中:(S,J)-> T,(S,T)-> J,T -> J

(S,J)和(S,T)都是候选码

数据库规范化 - 六大范式解析_第6张图片

现在当zhangsan取消了课程2,是不是li老师就没了?

存在主属性间的依赖关系,符合3NF,不符合BCNF

即需要分为两个表:ST(S,T),TJ(T,J)

在这里插入图片描述

数据库规范化 - 六大范式解析_第7张图片


第四范式:4NF

上面的1NF/2NF/3NF/BCNF都是在函数依赖的范畴
第四范式是针对多值依赖的数据依赖

有一个表CTB:课程、教师、书籍,候选码为(C,T,B),即全码
数据库规范化 - 六大范式解析_第8张图片

存在问题,当需要删除一个教科书,光学,需要删除多个元组(物理,li,光学)、(物理,zhang,光学)

  • 多值依赖:属性表X,Y,Z是属性集U的子集,Z=U-X-Y,当给定一个(X,Z),能得到多个Y,即X->->Y,Y多值依赖与X

  • 平凡多值依赖: X->->Y,Z为空,称 X->->Y为平凡多值依赖

上面的T多值依赖与C

4NF:关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖

很明显,将CTB表分为CT表和TB表即符号4NF,CT表没有多值依赖,TB表为平凡的多值依赖


第五范式:5NF

函数依赖和多值依赖是两种重要的数据依赖,只考虑函数依赖,BCNF已经是规范化程度最高,考虑多值依赖,4NF规范化程度最高

如果消除4NF中存在的连接依赖,可进一步到达5NF

连接依赖不像函数依赖、多值依赖可以由语义导出,而是在关系的连接运算中反映出,多值依赖实际上是一种特殊的连接依赖

设关系模式R、Ri的属性集是U、Ui,UiU(1≤i≤n).若R每个容许的实例r均满足r=∏U1®∞…∞∏Un®则称R满足连接依赖,记作∞(R1,…,Rn).若其中某个Ui=U,则称连接依赖是平凡连接依赖

你可能感兴趣的:(MySQL)