数据依赖(决定),码,范式,规范化与反规范化
关系模式中的函数依赖
- 假设有如下学生选课关系模式:R(学号,姓名,课程号,课程名,成绩,院系号,院系名), 其中(学号,课程号)为主码,则存在如下函数依赖:
- (学号)→(姓名) 非平凡函数依赖
- (学号,姓名)→(姓名) 平凡函数依赖
- (学号,课程号)→(成绩) 完全函数依赖
- (学号,课程号)→(课程名) 部分函数依赖,课程名只依赖于课程号
- (学号)→(院系名) 传递函数依赖,(学号)→(院系号),(院系号)→(院系名)
函数依赖对关系模式的影响
- 假设有如下学生关系模式:R(学号,姓名,课程号,课程名,成绩),其中(学号,课程号 )为主码。(学号,课程号)→(成绩),(学号)→(姓名),(课程号)→(课程名)。这个关 系模式有部分函数依赖,存在4个问题:
- 数据冗余太大: 每一个学生姓名重复出现,重复次数与该学生所选课程数相同;每一门课程 名重复出现,重复次数与选修该课程的学生数相同,这将消耗不必要的存储空间。
- 更新异常: 学生修改姓名或课程修改课程名后,必须修改系统中所有选课有关的元组,如果 某一个元组没有被修改,将会导致数据不一致。
- 插入异常: 如果新开一门课程,还没有学生选,就无法把这个课程的信息存入数据库。
- 删除异常: 如果学生全部毕业了,在删除学生信息的同时,把课程信息也丢掉了。
- 解决方案:规范化,将上面的关系模式分解为R1(学号,姓名)、R2(课程号,课程名), R3(学号,课程号, 成绩)
- 结论:含有部分函数依赖,传递函数依赖的关系模式不是一个好 的关系模式。规范化理论正是用来改造关系模式,通过分解关系 模式来消除其中不合适的数据依赖,以解决插入异常、删除异常 、更新异常和数据冗余问题。
范式
思维导图
第一范式
- 关系模式R(学号,姓名,获奖),其中(学号)是主码,R不满足第一范式,因为 一个学生可能获得多个奖项。
- 为了使R满足第一范式,有两种处理方式:
- ①如果知道一个学生的获奖不超过3项,可以分解为R(学号,姓名,获奖1,获奖 2,获奖3)。这种处理方式使得R满足第一范式,但当大部分学生获奖较少时,数 据库中将产生大量的空值,同时可扩展性较差。
- ②将R分解为R1(学号,姓名)和R2(学号,获奖)两个关系模式。R1中(学号 )作主码,R2中(学号)为外码,R2中(学号,获奖)作主码,这样避免了方式 ①的缺陷并使得R1和R2均满足第一范式。
第二范式
- 关系模式R(学号,课程号 ,姓名,课程名,成绩),R满足第一范 式,但不满足第二范式。因为(学号)→(姓名),(课程号)→( 课程名),(学号,课程号)→(成绩)。 •
- 分解为三个关系模式:
- R1(学号,姓名) (学号)为主码
- R2(课程号,课程名) (课程号)为主码
- R3(学号,课程号,成绩) (学号,课程号)
第三范式
- 关系模式R(学号,姓名,院系号,院系名),R满足第二范式,但不满 足第三范式,因为(学号)→(院系号),(院系号)→(院系名)。
- 分解为两个关系模式:
- R1(学号,姓名,院系号) (学号)为主码
- R2(院系号,院系名) (院系号)为主码
BC范式
- 设有一个仓库管理关系模式R(仓库号,物品号,管理员号,数量)。(仓库号,物品号)和(物品号,管理员号)均为候选码,上面关系是满 足第三范式的,但不满足BC范式,因为(管理员号)→(仓库号)。
- 分解为两个关系模式:
- R1(仓库号,物品号,数量) (仓库号,物品号)为主码
- R2(仓库号,管理员号) (管理员号)为主码
规范化与反规范化
规范化的步骤
-
对满足1NF的关系模式进行投影,消除原关系模式中非主属性对码 的部分函数依赖,将满足1NF的关系模式转换为若干个满足2NF的关 系模式。
-
对满足2NF的关系模式进行投影,消除原关系模式中非主属性对码 的传递函数依赖,从而产生一组满足3NF的关系模式。
-
对满足3NF的关系模式进行投影,消除原关系模式中主属性对码的 部分函数依赖和传递函数依赖,得到一组满足满足BCNF的关系模式
-
对原关系进行投影,消除 决定属性不是侯选码的任何函数依赖
反规范化
- 在关系型数据库中,反规范化是指在数据库规范化后,为了提高数据 检索性能,在某些局部降低规范化标准,引入适当的冗余的方法。
- 反规范化数据库不应该和从未进行过规范化的数据库相混淆,反规范 化引入的冗余是一种受控的冗余。
- 反规范化常用的方法是合并1:1联系的表,合并1:n联系的表,复制 1:n联系1端表中数据到n端,复制m:n联系中m端和n端数据到新产 生的联系表中。