简介
范式是一种分层结构的规范,从第一范式到第六范式,每一层都更加严格且必须满足上一范式
MySQL属于关系型数据库,容易产生空间浪费,这就与范式解决的问题不谋而合,所以在设计数据库时,常常会用到范式
但是数据库不单单是要解决空间问题,还要解决效率问题,所以一般情况下,只需满足前三范式
1NF(第一范式):所有属性都是不可分割的原子值
也就是每个属性都是不可再分的
例如下图就不符合第一范式的要求
实际上,1NF是所有关系型数据库的最基本要求,你在创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的,如下为满足1NF要求的设计:
2NF(第二范式):在第一范式的基础上,要求非主属性都要和主键有完全依赖关系
例如下图就不符合第二范式要求
此设计有如下问题:
- 数据冗余过大:每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次
- 插入异常:假如学校新建了一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),那么是无法将系名与系主任的数据单独地添加到数据表中去的
- 删除异常:假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)
- 修改异常:假如李明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据
对于第二范式,所有的非主属性要依赖于主属性
所以做出修改:
这是改进后的依赖关系
由此可将1NF改进为2NF
但是修改后如删除某个系的所有学生记录,该系的信息仍然全部丢失,所以我们要使用第三范式
3NF(第三范式):在第二范式的基础上,非主键数据之间不能相互依赖,依赖关系不能传递,每一个非主键数据都必须要和主键直接依赖而非间接依赖
对于第三范式,这是做出改进后的依赖关系
由此可将2NF改进为3NF