1. 第一范式(1NF)(针对具体某一列)
2.第二范式( 2NF )(针对某一列与复合主键的一部分有关)
所谓第二范式,是指所有的非主属性都完全依赖于关键字。从这个定义可以看出,第二范式不存在非主属性对于部分候选关键字的部分依赖,不过允许非主属性之间存在着传递依赖。
3、第三范式(3NF)(针对某一列与主键无关,但是与某一非主键列有关)
所谓第三范式,是指每一个非主属性既不部分依赖于也不传递依赖于关键字,也就是在第二范式的基础上消除传递依赖(A>B>C)。
4、BCNF(针对某一列与复合主键中的某一列有关,而与其他主键无关)
所谓BCNF,是指在第三范式的基础上进一步消除主属性对于码的部分函数依赖和传递依赖。BCNF需要符合3NF,并且,主属性不依赖于主属性。
5、4NF(第四范式)
对于第四范式,从理论层面来讲是,关系模式R∈1NF,如果对于R对于R的每个非平凡多值依赖X→→Y(Y不属于X),X都含有候选码,则R∈4NF。4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。显然一个关系模式是4NF,则必为BCNF。
6、5NF(第五范式)
第五范式(5NF):是最终范式。消除了4NF中的连接依赖。
mysql中有六大范式,但是我们一般日常工作中只会用到三大范式
第一范式
确保每列保持原子性
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定,有什么写什么,是无法分割的。下图
第二范式
这个表就没有遵循第一范式的原则,家庭信息这栏就可以分为家庭人口跟家庭住址两栏信息
上图这样的表格就可以是完美遵循了第一范式,原子不可分解
第二范式
确保表中的每列都和主键相关
前提:满足第一范式
每个非主属性都完全函数依赖于任一候选码
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
像班级地址这个东西在学生表里就是可以不用出现的,跟学生信息不是直接的关系,地址可以在班级信息里出现,所以这个表是没有遵循第二范式的基本原则
第三范式
确保每列都和主键列直接相关,而不是间接相关
第三范式就是将两张表建立相同的字段,用这个相同的字段将两张表建立联系,彼此列之间没有依赖关系
前提:满足第二范式
消除了传递函数依赖
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。