黑马程序员技术交流社区

标题: 关于数据库关系模式分解的问题 [打印本页]

作者: 柳雷    时间: 2012-7-25 08:08
标题: 关于数据库关系模式分解的问题
本帖最后由 柳雷 于 2012-7-25 13:48 编辑

一个关于数据库的理论的问题
关系模式的规范化用来避免数据库的插入异常,删除异常,数据冗余等问题。
范式:将建立关系满足的约束条件划分成若干标准,这些标准称为范式。
第一范式:数据项不可再分
第二范式:非主属性都决定于主键
第三范式:非主属性都不间接决定于主键
这三个范式之间有向下包含的关系,即满足第二范式必满足第一范式。
任何一个非规范化的关系经过分解都可达到第三范式。
分解的基本原则:分解后信息不能丢失、分解后的关系要相互独立。

一个第二范式的例子
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
  这个数据库表不满足第二范式,因为存在如下决定关系:
  (课程名称) → (学分)
  (学号) → (姓名, 年龄)
  即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:
1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了门课程,姓名和年龄就重复了-1次。
2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
  把选课关系表Ss改为如下三个表:
  学生:Sn(学号, 姓名, 年龄);
  课程:s(课程名称, 学分);
  选课关系:Ss(学号, 课程名称, 成绩)。
  这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。


还有第三范式这样一个例子:
假定学生关系表为Sn(学号, 姓名, 年龄, 所在[]学院[], 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:
  (学号) → (姓名, 年龄, 所在[]学院[], 学院[]地点, []学院[]电话)
这个关系模式满足第二范式但是不满足第三范式
但是我分析不出来数据冗余、更新异常、插入异常和删除异常的情况?
帮我分析一下吧





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2