您的位置:首页 > 数据库

关系数据库设计理论

2008-09-02 22:39 525 查看
关系数据库设计理论 构造一个关系数据库模式的方法可有多种 1、举例(学生选课数据库) *数据库模式的构造方法一 用一个关系模式来描述学生选课信息() SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade ) *数据库模式的构造方法二 *概念模型为(E-R图): m n *将概念模型转换为以下关系模式: *学生表S tudent( S no , S name, S sex, S age, S dept) ; *课程表C ourse( C no , C name, C pno, C credit) *学生选课 SC( Sno,Cname ,Grade) SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade )
S no S name S sex S age S dept C no C name C credit Grade
001 张三 18 101 Pascal 4 90
001 张三 18 102 操作系统 4 80
001 张三 18 103 编译 3 98
001 张三 18 105 数据库 4 87
001 张三 18 110 数据结构 4 70
002 李四 17 信电 103 编译 4 82
002 李四 17 信电 105 数据库 4 87
003 王五 19 化工 107 网络 3 86
*学生表S tudent( S no , S name, S sex, S age, S dept) ; *课程表C ourse( C no , C name, C pno, C credit)
C no C name C credit
101 Pascal 4
102 操作系统 4
103 编译 3
105 数据库 4
107 网络 3
110 数据结构 4
*学生选课 SC( Sno,Cname ,Grade)
S no C no Grade
001 101 90
001 102 80
001 103 98
001 105 87
001 110 70
002 103 82
002 105 87
003 107 86
S no S name S sex S age S dept
001 张三 18
002 李四 17 信电
003 王五 19 化工
2、数据库模式(关系模式)的不同构造方法与数据冗余度、插入异常、删除异常、更新异常的关系 1) 冗余度比较 *方法1冗余度很大:学生信息冗余大(一个学生如选修n门课,其信息要重复存放n遍。如001号张三,重复存放5遍);课程信息冗余大(一门课程被 n 个学生选修,课程信息存放 n 次) *方法2冗余度小:只有学号课程号有冗余。冗余度大大小于前一个,它仅有少量冗余数据,这些冗余数据保持在合理水平。 2) 更新异常(修改复杂) *方法1:由于数据冗余,更新数据库中的数据时,系统需要付出很大的代价来维护数据库的完整性; *方法2:修改复杂度大大减少。 3) 插入异常 *方法1:没选课程的学生信息,没被选修的课程信息,没法插入到表中;(插入异常) *方法2:不同信息存放在不同的关系中,不产生插入异常现象。 4) 删除异常 *方法1:如某门课只有一个学生选修,学生毕业或因病退学后,删除相关信息后,课程等信息也被全部删除;(删除异常) *方法2:不同信息存放在不同的关系中,不产生删除异常现象。 3、小结 1) 在关系数据库设计中,关系模式的设计方案可以有多个; 2) 不同的设计方案有好坏之分; 3) 要设计一个好的关系模式方案,要以规范化理论作为指导,规范化理论研究属性间的数据依赖关系,主要有函数依赖与多值依赖。关系规范化按属性间不同的依赖程度分为第一范式、第二范式、第三范式、BC范式、第四范式。 4.1 函数依赖 函数依赖是关系模式内属性间最常见的一种依赖关系 1、 关系中属性间函数依赖举例 学生关系属性的集合U={ Sno,Sdept,Mname,Cname,Grade } 现实世界的已知事实: 1) 一个学生只属于一个系(含义:学号确定后,学生所在的系也就被唯一确定了。类似于数学中的函数y=f(x),x=Sno,y= Sdept 。我们说 Sno 函数决定 Sdept, 或者说 ,Sdept 函数依赖于 Sno, 记做 sno → sdept ; 反过来一个系有若干学生(解释系不能决定学生) 2) 一个系只有一名系主任(含义:系确定后系主任名被唯一确定了,类似于数学中的函数,我们说 Sdept 函数决定 Mname, 或者说 ,Mname 函数依赖于 Sdept 。记做 S dept → Mname ) 3) 一个学生可以选修多门课,每门课程有若干学生选修(含义:学号与课程号间够不成决定被决定关系) 4) 每个学生所学的每门课程都有一个成绩,含义: (sno,cname) → Grade 属性组 U 上的一组函数依赖 F={ sno → sdept, S dept → Mname,(sno,cname) → Grade } 2、 函数依赖定义(4 . 1) 设 R(U) 是一个关系模式, U 是 R 的属性集合, X 和 Y 是 U 的子集。对于 R(U) 的任意一个可能的关系 r ,如果 r 中不存在两个元组,他们在 X 上的属性值相同,而在 Y 上属性值不同,则称“ X 函数决定 Y ”或“ Y 函数依赖于 X ” , 记作 X → Y 见下表,如Sno →Sname,则 不存在 蓝色 两元组(即学号确定后,姓名不确定):
S no S name S sex S age S dept
001 张三 18
001 赵六
002 李四 17 信电
003 王五 19 化工
思考题:1)码是否一定函数决定非码属性?非码属性间是否存在函数依赖 2)SNo → Sdept 成立 (Sno,Cno) → Sdept 是否也成立? 3)找出以下几个表的中的函数依赖 SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade ) *学生表S tudent( S no , S name, S sex, S age, S dept) ; *课程表C ourse( C no , C name, C pno, C credit) *学生选课 SC( Sno,Cname ,Grade) 函数依赖的几点说明: 1) 函数依赖是所有关系实例(关系模式值的每一状态)均要满足的约束条件。 2) 函数依赖是语义范畴。只能根据语义确定函数依赖。如:在没有同名的情况下“姓名 → 年龄”成立 3) 数据库设计者可以对现实世界作强制的规定。 4) 若 X → Y ,则 X 称为这个函数依赖的决定属性集 5) 若 X → Y,Y → X 则记为 X Y 6) 若 Y 不函数依赖于 X ,则记为 X Y 3、 平凡函数依赖与非平凡函数依赖定义( 4.2 ) 在关系模式 R(U) 中,对于 U 的子集 X 和 Y ,如果 X → Y ,但 Y 不是 X 的子集,则称 X → Y 是非平凡函数依赖。若 Y 是 X 的子集,则称 X → Y 为平凡函数依赖。 对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。(为什么?) 4、 完全函数依赖与部分函数依赖 在关系模式 R(U) 中,如果 X → Y, 并且对于 X 的任何一个真子集 X' 都有 X' → Y ,则称 Y 完全函数依赖于 X ,记作 X → Y( 少 f) 。若 X → Y ,但 Y 不完全函数依赖于 X ,则称 Y 部分函数依赖于 X ,记 X → Y (少 P )。 5、 传递函数依赖 在关系模式 R(U) 中,如果 X → Y , Y → Z ,且 Y 不是 X 的子集, X 不函数依赖于 Y ,则称 Z 传递函数依赖于 X 。 Std(Sno,Sdept,Mname) 有 Sno → Sdept, Sdept → Mname , Mname 传递函数依赖于 Sno 6、 码 设 K 为关系模式 R( U, F )中属性或属性组。若 U 完全依赖于 K ,则 K 称为 R 的一个侯选码。若关系模式中有多个侯选码,则选定一个作为主码。 4.2范式 *1 NF :关系模式 R 的所有属性都是不可分割的基本数据项,则 R ∈ 1NF ( 非主属性函数依赖于码 ) *不满足1NF的举例: 学生 ( 学号,姓名,年龄, 入学毕业年月 ) *1 NF 是关系模式的起码要求 *第一范式举例: SLC(Sno,Sdept,Sloc,Cno,Grade) 属性函数依赖情况: (虚线表示部分函数依赖,实线表示完全函数依赖) 插入异常:未选课的学生不能插入,因为码值部分为空( 原因是对码的部分函数依赖造成 )。(解决问题的办法:把部分函数以来部分分解出来) 删除异常:某一学生的选课信息全部删除后,学生的其他信息也被删除,否则码值部分为空(不允许)( 原因是对码的部分函数依赖造成 )。(解决问题的办法:把部分函数以来部分分解出来) 数据冗余度大:一个学生选修了多门课程,同一学生的基本信息( Ssept,Sloc )需要保存多次。( 原因是对码的部分函数依赖造成 )。(解决问题的办法:把部分函数以来部分分解出来) 修改复杂:修改某学生基本信息时,如果其选修多门课程,同一信息需要重复修改多次。( 原因是对码的部分函数依赖造成 )(解决问题的办法:把部分函数以来部分分解出来) 2 NF :满足第一范式,非主属性完全函数依赖于码 前面的关系模式不满足第二范式,分解为下面两个模式后,部分函数依赖被消除: SC(sno,cno,grade) SL(Sno,Sdept,Sloc) 分解成第二范式后 SC(sno,cno,grade) , SL(Sno,Sdept,Sloc) 。以上4个问题在一定程度上得到了解决。 1) SL 关系中可以插入尚未选修的学生 2) 删除学生选课关系,只涉及 SC 关系,不涉及 SL 中的学生基本信息。 3) 由于学生选课信息于学生基本信息分开存放,不论该学生选修了几门课, Sdept 与 Sloc 值都只存储一次。 4) 某学生转系,只需要修改相关关系中的一个元组。 第二范式 SL 中存在传递函数依赖,使得 SL 仍然存在上述4个问题。 1) 插入异常:系刚成立,无在校学生,无法存入系信息。(解决问题的办法:把与主码无关的函数部分分解出来独立构成关系模式,即消除 对主码的传递函数依赖) 2) 删除异常:某系的全部学生毕业了,系的信息也丢失了。(解决问题的办法:把与主码无关的函数部分分解出来独立构成关系模式,即消除对主码的传递函数依赖) 3) 数据冗余度大:每一个系的学生都住在同一个地方,关于系的住处信息却要重复出现。 4) 修改复杂:当某系学生调整住处时,需要修改所有学生的 Sloc 属性值。 造成上述4个问题的主要原因:非主属性传递函数依赖于主码。 解决办法:将传递函数依赖关系分解出来。 3NF :满足第2范式,且主属性既不部分函数依赖于码,也不传递函数依赖于码 SL(Sno,Sdept,Sloc) 分解为 SD(sno,sdept) DL(Sdept,Sloc) 规范化过程: 规范化过程即为关系模式的不断分解过程。 规范化的实质:概念的单一化。 规范化的目的: 不断解决关系插入异常、删除异常、数据冗余度大、修改复杂问题。 3NF 是工程上的标准,在工程应用上,达到第三范式一般情况下就可以了 4.3 关系模式的规范化 1、 第一范式到第三范式的分解过程:分解关系模式消除非主属性对码的部分函数依赖,分解关系模式消除非主属性对码的传递函数依赖。 2、 关系模式的分解方法并不唯一,只有能够保证分解后的关系模式与原关系模式等价的方法才有意义。 1) 分解具有无损连接性:分解后不能丢失信息,即分解前的关系与分解后关系的自然连接结果相等。 2) 分解后应能保持函数依赖。分解前的函数依赖F被分解后关系模式函数依赖F i 所逻辑蕴含 3) 分解既保持函数依赖,又保持无损连接。 3、 第3范式是工业标准 若要求分解既具有无损连接,又保持函数依赖,那么模式分解一定能达到3 NF ,但不一定能达到 BCNF 。 习题: P 143 第3题 学生(学号,姓名,出生年月,系名,班号,宿舍区) 班级(班号,专业名,系名,人数,入校年份) 系(系名,系号,系办公室地址,人数) 学会(学会名,成立年份,地点,人数) 学生参加学会(学号,学会名,入会年份) 只考虑与1、2、3 NF 有关的函数依赖(非主属性部分或完全函数依赖于码,非主属性传递函数依赖于码) 学生(学号,姓名,出生年月,系名,班号,宿舍区) 分解为:学生( 学号 ,姓名,出生年月,班号,系) 系宿舍( 系名 。宿舍区) 班级(班号,专业名,系名,人数,入校年份) 分解为:班级(班号,专业名,人数,入校年份) 专业系(专业名,系名) 系(系号,系名,系办公室地址,人数) 学会(学会名,成立年份,地点,人数) 学生参加学会(学号,学会,入会年份)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息