就如同景区评级一样,5A级景区比4A级景区更规范,要求也更多
范式就是数据库表的评级,可以理解为表结构的设计标准的级别,是关系的约束条件的规范,范式越高,表的划分越细
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF - Boyce Codd Normal Form)、第四范式(4NF)和第五范式(5NF,又称完美范式)
范式来自英文Normal Form,简称NF
范式是关系的规范,NoSql非关系型数据库没有范式
列的原子性:每一列不可再分
例如:
这种表结构是不符合1NF的
1NF是关系型数据库的基本要求,创建表时不符合1NF的操作一定不成功
但很多时候是要根据系统的需求程序员自行判断1NF
例如:City属性
如果当前系统需要判断省、市,这个city属性就是需要再细分的
在1NF的基础上,且每一个非主属性完全函数依赖与候选码
2NF的表,每一行数据仅可以被候选码唯一区分,也就是数据仅专注于一件事
2NF通俗来说:必须候选码中所有主属性都确定才能确定其他的非主属性
假设候选码是id,classId,通过这两个属性可以确定数据行
但是通过id可以确定name和addres,通过classId可以确定score,仅符合1NF,不符合2NF
这样的表结构操作数据会出现什么问题?
所有就需要2NF:
student表专注于学生信息,class表专注于课程成绩
这就是2NF的作用:数据表专注于一件事,不掺杂其他复杂的关系,让表更容易操作维护
在2NF基础上,消除依赖传递,任何非主属性不依赖与其他非主属性
即每个属性都和候选码有直接关系,不存在非主属性间的相互依赖
3NF在2NF的基础上禁止了
非主属性b和a之间的依赖,下面这个图不符合3NF
举个栗子:id是候选码,通过id可以确定数据行
但是通过address可以确定country,即address -> country,country函数依赖与address,符号2NF,不符合3NF
3NF继续细化了表结构,让表专注于一个功能
规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。
实际上,数据库的设计满足3NF就基本够了,表已经细化到可以接受了
当初设计范式是为了针对数据库表的数据冗余,当一个表数据属性过多,我们仅需表中的几个数据,却查出几十列数据,这个表是不规范的
通过3NF的规范化,数据基本达到要求
需求 > 性能 > 表结构,不用为了范式而设计数据库,而是为了需求设计数据库
BCNF:每一个决定因素都包含候选码,在3NF的基础上消除主属性对于候选码码的部分与传递函数依赖,BCNF被认为是扩充的第三范式
3NF里:
但还是存在缺陷:
举个栗子:
STJ(S,T,J)表,S表示学生,T表示教师,J表示课程,每一个教师只教一门课,每门课有若干教师,某个学生选定某门课就对应一个教师
其中:(S,J)-> T,(S,T)-> J,T -> J
(S,J)和(S,T)都是候选码
现在当zhangsan取消了课程2,是不是li老师就没了?
存在主属性间的依赖关系,符合3NF,不符合BCNF
即需要分为两个表:ST(S,T),TJ(T,J)
上面的1NF/2NF/3NF/BCNF都是在函数依赖的范畴
第四范式是针对多值依赖的数据依赖
有一个表CTB:课程、教师、书籍,候选码为(C,T,B),即全码
存在问题,当需要删除一个教科书,光学,需要删除多个元组(物理,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表为平凡的多值依赖
函数依赖和多值依赖是两种重要的数据依赖,只考虑函数依赖,BCNF已经是规范化程度最高,考虑多值依赖,4NF规范化程度最高
如果消除4NF中存在的连接依赖,可进一步到达5NF
连接依赖不像函数依赖、多值依赖可以由语义导出,而是在关系的连接运算中反映出,多值依赖实际上是一种特殊的连接依赖
设关系模式R、Ri的属性集是U、Ui,UiU(1≤i≤n).若R每个容许的实例r均满足r=∏U1®∞…∞∏Un®则称R满足连接依赖,记作∞(R1,…,Rn).若其中某个Ui=U,则称连接依赖是平凡连接依赖