一、范式的定义
什么是范式
范式来自英文Normal form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,这就是我们俗称的范式。范式分成几个等级,一级比一级要求得严格。
简单归纳
第一范式(1NF):字段不可分;
第二范式(2NF):有主键,非主键字段依赖主键;
第三范式(3NF):非主键字段不能相互依赖。
二、第一范式 (1NF)
符合1NF的关系中的每个属性都不可再分
- 通俗的理解为,数据库表的每一列都是不可再分的原子列,如下图所示就不符合1NF的要求
也就是说,只要在关系型数据库中已经存在的数据表,一定是符合1NF的,如下图所示就符合1NF的要求
第一范式存在的问题
数据冗余过大
- 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次
插入异常
- 假如学校新建了一个系,但是暂时还没有招收任何学生,那么添加数据时,会将系名与系主任的数据单独地添加到数据表中,而没有添加学生列的数据,数据添加不合法
删除异常
- 删除时会将整行的数据删除,假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)
修改异常
- 假如李勇转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据
三、第二范式 (2NF)
第二范式必须满足第一范式。
第二范式是指每个关系必须有一个(有且仅有一个)数据项作为主键,其他数据项与主键一一对应,即其他数据项完全依赖于主键。由此可知单主属性的关系均属于第二范式。
四,第三范式(3NF)
非主属性既不传递依赖于码,也不部分依赖于码。
理解:即在第二范式的基础上,消除了非主属性对码的传递依赖。
比如:
巴斯-科德范式(BCNF)
属于修正的第三范式,是防止主键的某一列会依赖于主键的其他列。当3NF消除了主属性对码的部分函数依赖和传递函数依赖称为BCNF。
特性:
1、所有主属性对每一个码都是完全函数依赖
2、所有主属性对每一个不包含它的码,也是完全函数依赖
3、没有任何属性完全函数依赖与非码的任何一组属性
举例:库存表(仓库名,管理员名,商品名,数量),主键为(仓库名,管理员名,商品名),这是满足前面三个范式的,但是仓库名和管理员名之间存在依赖关系,因此删除某一个仓库,会导致管理员也被删除,这样就不满足BCNF