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