在对数据库进行一些操作的时候我们可能会遇到以下的一些问题:
- 数据冗余(想修改一个属性,就要更新多行数据)
- 插入异常(想要插入数据,结构因为表设计的问题,导致不能成功插入)
- 删除异常(只想删除其中的某些数据 ,结果把不该删的也删了)
- 更新异常(想更新一条数据,结果工作量大,还容易出错)
其实这就是因为有数据依赖的原因,因为彼此之间有一些依赖关系,所以导致我们的操作总是牵涉颇多,处理不干净
数据依赖的几个重要函数依赖:
1. 完全函数依赖
比如在学生课程(学号,课程号,成绩)关系中,"学号,课程号"是主码,只有学号不能确定成绩,只有课程号也不能确定成绩,因此"成绩"完全函数依赖于(学号、课程号)
2. 部分函数依赖
比如在学生课程(学号,课程号,学生姓名,成绩)关系中,"学号、课程号"是主码,只要有学号就可以确定学生姓名的,因此存在部分依赖
3. 传递函数依赖
在学生关系(学号,姓名,性别,所在系,系主任)中,只要有学号就可以确定所在系,有所在系也可以确定系主任,因此学号可以确定系主任,这就是传递函数依赖
要消除表中一些不必要的依赖关系,则就需要对关系模式进行规范化,而规范化的过程实际上可以理解为模式分解,对于不同的规范化程度呢,我们可用范式来衡量。
范式是符合某一种级别的关系模式的集合,是衡量关系模式规范化程度的标准,达到的关系才是规范化的。
目前有6中范式:
- 第一范式(1NF):每个属性都是不可再分的
- 第二范式(2NF):不存在非主属性对主属性的部分函数依赖
- 第三范式(3NF):不存在非主属性对主码的传递函数依赖
- BC范式(BCNF):不存在任何属性完全函数依赖于非码的任一组属性
- 第四范式
- 第五范式
一般来说,满足前三个范式,就已经很满意了