数据库范式
在说范式的规范之前先说明一下有哪些函数依赖
- 完全函数依赖
- X->Y,并且X的任何真子集都无法决定Y,那么Y对X完全函数依赖
- 如 (学号,课程号)->成绩,学号或者课程号都无法单独决定成绩,是完全函数依赖的
- 如果不是复合候选码,则一定是完全函数依赖
- 部分函数依赖
- X->Y,但X的其一真子集可以决定Y,那么Y对X部分函数依赖
- 如 (学号,身份证号)->姓名,学号或者身份证号都可以单独确定姓名,是部分函数依赖
- 传递依赖
- X->Y,Y->Z,那么Z对X传递依赖
候选键:可以唯一标识所有属性的就是候选键,主键是从候选键中选出来的一个
主属性:候选键中包含的属性就是主属性
规范化理论
范式
第一范式1NF(属性原子性)
字段具有原子性,保证字段不可分
数据库表中的所有字段都是单一属性,不可再分
第二范式2NF(消除部分函数依赖)
在第一范式的基础上,非主属性完全依赖于候选键
数据库表每一行必须被唯一标识
- 必须有一个主键
- 没有包含在主键的列必须完全依赖于主键,且不能只依赖于主键的一部分
单属性候选键至少满足2NF
第三范式3NF(消除传递函数依赖)
在第二范式的基础上,消除非主属性对候选键的传递依赖
每一个非主属性都不传递依赖于候选键,也就是说数据表中不包含已在其他表中已包含的非主键信息,信息不冗余
没有非主属性,至少满足3NF
BCNF(消除主属性对候选码的部分和传递依赖)
设R是一个关系模式,F是它的依赖集,R属于BCNF当且仅当其F中每个依赖的决定因素必定包含R的某个候选码,也就是主属性不依赖于候选键
数据库表中不存在任何字段对任何一候选关键字段的传递依赖
- 所有非主属性对每一个码都是完全函数依赖
- 所有的主属性对于每一个不包含它的码,也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任意一个组合
如果达到3NF会造成 数据冗余、插入异常、修改异常、删除异常的问题