数据库设计三大范式
第一范式
要求建立的数据库表中所有的列是原子的,每一列不可再拆分;目前的关系型数据库默认都是满足第一范式(不可能创建出不满足第一范式的数据表)
第一范式:列不可再分
观察以上表,满足第一范式,但是存在以下问题:
- 大量的数据冗余
- 进行插入操作时会出现插入的异常
- 在删除操作时会将一些不能删除列也一并删除(删除异常)
第二范式
数据库表中不存在非关键字段(主键)对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字(联合主键)中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
- 关键字段: 主键
- 组合关键字:联合主键
- 函数依赖:字段A->字段B,那么B依赖A,称之为函数依赖
- 部分依赖:(字段A,字段B)->字段C ,字段C部分依赖A和B,称之为部分依赖
- 完全依赖:要求非联合主键的字段完全依赖主键,或者字段完全依赖联合主键
第二范式:在满足第一范式的情况下,表中的非主键列对主键列必须完全依赖经过第二范式的规范,数据冗余的问题解决了,但是:
- 进行插入操作时会出现插入的异常
- 在删除操作时会将一些不能删除列也一并删除(删除异常)
两个问题还是存在
第三范式
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A
- 传递函数依赖:表中的列存在A决定B,B决定C的关系
第三范式: 满足第二范式的基础上,要求表中列不能存在传递依赖关系范式总结
在实际开发中,一般情况只要满足三大范式即可;另外,由于程序对查询的需求(处于便捷性考虑)可能会出现违背三大范式的情况;因此三大范式只是设计数据时候的一种参考,并不是定律。
范式的存在主要解决了:
- 数据冗余
- 更新(insert,delete)操作异常