1.02k likes | 1.12k Views
第六章 关系数据理论. 设计任何一个数据库应用系统,现实世界→ E-R 模型→关系模型 , 都会遇到如何构造合适的数据模式,即逻辑结构的问题; 对于初步的关系模式,可能存在这样或那样的问题(如插入异常、删除异常等),需要利用 关系数据库设计理论 进行规范化,以逐步消除存在的问题,从而得到一定规范程度的关系模式,这就是本章要讲的内容;. 本章是关系模型的理论基础之二,该理论是指导数据库设计的重要依据。
E N D
设计任何一个数据库应用系统,现实世界→ E-R模型→关系模型,都会遇到如何构造合适的数据模式,即逻辑结构的问题; • 对于初步的关系模式,可能存在这样或那样的问题(如插入异常、删除异常等),需要利用关系数据库设计理论进行规范化,以逐步消除存在的问题,从而得到一定规范程度的关系模式,这就是本章要讲的内容;
本章是关系模型的理论基础之二,该理论是指导数据库设计的重要依据。本章是关系模型的理论基础之二,该理论是指导数据库设计的重要依据。 本章将阐述关系数据库中最深的一些特性——函数依赖、多值依赖和连接依赖,以及由此引出的诸多异常,如插入异常、更新异常、删除异常及冗余等,对于出现的问题,通过理论引入,对关系模式的规范化进行系统阐述。
本次课主要内容 • 关系模型概念回顾 • 关系模式中可能存在的异常 • 关系模式中存在异常的原因 • 关系模式的规范化
一、概念回顾 • 关系:描述实体、属性、实体间的联系。从形式上看,它是一张二维表; • 关系模式:对关系的描述;关系数据库中,关系模式是型,关系是值; • 关系数据库:基于关系模型的数据库; • 关系数据库的模式:对关系数据库的描述,关系数据库的型也称为关系数据库模式。
关系模式的形式化定义 关系模式由五部分组成,即它是一个五元组:R(U, D, DOM, F) R: 关系名; U: 组成该关系的属性名集合—一组属性U; D: 属性组U中属性所来自的域; DOM:属性向域的映象集合 F: 属性间数据的依赖关系集合
二、关系模式中可能存在的异常 例1:建立一个描述学校教务的数据库:学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)成绩(Grade); • 假设用单一的关系模式 Student 来表示,则该关系模式的属性集合U ={ Sno, Sdept, Mname, Cname, Grade } • 现实世界已知事实的语义: • 一个系有若干学生, 一个学生只属于一个系; • 一个系只有一名系主任; • 一个学生可以选修多门课程, 每门课程有多名学生选修; • 每个学生所学的每门课程都有一个成绩。
数据冗余 • 如果一个系有多名学生或该学生选修了多门课程,则系名称和系主任姓名就要出现多次,浪费了存储设备; • 操作异常 由于数据的冗余,在对数据操作时会引起各种异常: • 更新异常:如果某系更换系主任或更换系名后,系统必须修改与该系学生有关的每一个元组;若有一个元组中的数据未更改,就会造成这个系主任姓名不一致现象。 --数据冗余 ,更新数据时,维护数据完整性代价大
操作异常 • 插入异常:如果一个系刚成立,无学生,或者虽然有学生但尚未安排课程,那么就无法把这个系及其负责人的信息加入数据库。 --应该插入而未被插入 • 删除异常:如果某个系的学生全部毕业了, 我们在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。 --不该删除的数据不得不删
结论: • Student关系模式不是一个好的模式。 • “好”的模式:不会发生插入异常、删除异常、更新异常,数据冗余应尽可能少。 • 如果将关系模式Student划分为三个关系模式S(Sno,Sdept ) SC(Sno,Cno,Grade ) Dept(Sdept, Mname ) 可基本解决以上问题,但分解后是否是最佳的模式,也不是绝对的。
三、关系模式中存在异常的原因 • 事实上,异常现象产生的根源,就是由于关系模式中属性间存在着复杂的依赖关系。如学生学号和学生姓名、学生学号和院系名称、院系名称和院系系领导之间都存在着依赖关系,这种依赖都称为数据依赖; • 数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系。 • 数据冗余的产生和数据依赖有着密切的关系;
数据依赖 • 是通过一个关系内部属性与属性之间的一种约束关系; • 是语义的体现; • 是现实世界属性间相互联系的抽象; • 是数据内在的性质; • 数据依赖的类型 • 函数依赖(Functional Dependency,简记为FD) • 多值依赖(Multivalued Dependency,简记为MVD) • 其他
函数依赖 函数依赖极普遍地存在现实生活中,如描述一个学生的关系: 学生(学号、姓名、系名、系领导),如果语义是:一个学号只对应的学生,一个学生只在一个系学习;那么 学号→姓名;学号→系名;系名→系领导 类似于 Y = F(x) 函数,变量x确定后,相应y的值也确定了; 可写为:name=f(sno),dept=f(sno),mname=f(sdept) 可称为:name和dept函数依赖于sno,mname函数依赖于dept;
Sno Cno Grade Sdept Mname • 对于关系模式Student={Sno, Sdept, Mname, Cno, Grade } • 由语义可得出一组函数依赖: F={Sno→Sdept, Sdept→Mname, (Sno, cno)→Grade }
例1:有一关系模式:供应商(供应商编号、供应商名称,供应商地址,供应商电话,供货名称,供货单价);一个供应商可以供应多种货物,同一种货物也可以由多个供应商供应;例1:有一关系模式:供应商(供应商编号、供应商名称,供应商地址,供应商电话,供货名称,供货单价);一个供应商可以供应多种货物,同一种货物也可以由多个供应商供应; 写出该关系模式的函数依赖集F ? 评价该关系模式,并举例说明是否存在下列问题 数据冗余 ;更新异常;插入异常 ;删除异常 如何改造该关系模式?
如何构造一个好的关系模式呢? 消除数据冗余,更新异常,插入异常和删除异常的关系模式 如何改造关系模式? 如何把一个不好的关系模式分解改造为一个好的关系模式,分析一个关系模式有哪些数据依赖,如何消除那些不合适的数据依赖,这就是关系数据库设计过程中要讨论的规范化理论问题。
四、关系模式的规范化 关系规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。 函数依赖 其他相关定义(候选码) 关系模式的范式
1、函数依赖 函数依赖定义 设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意两个元组t1和t2,如果t1[X]= t2 [X],则t1[Y]= t2 [Y] ,那么称X函数确定Y或Y函数依赖X,记作 X→Y。 不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等 任意:关系模式R中的所有关系都要满足约束条件 在X上:取值唯一 所谓函数依赖是指一个或一组属性的值可以决定其它属性的值。函数依赖正如一个函数 y = f(x) ,x的值给定后,y的值也就唯一地确定了。
对于关系模式R ,U为属性集合,XY为其属性子集,根据函数依赖定义和实体间联系的定义,可得出如下结论: 若X和Y是1:1的联系,则存在函数依赖X→Y 和Y →X; 若X和Y是1:n的联系,则存在函数依赖Y →X; 若X和Y是m:n的联系,则XY之间不存在函数依赖关系。 以关系模式student为例 系与系主任是 1:1,故有sdept →Mname和Mname→sdept; 系与学生是 1: n,故有sno →sdept 学生与课程是m :n,故sno和cno之间不存在函数依赖
例: S (Sno, Sname, Ssex, Sage, Sdept) 假设学生姓名不允许重名,则有: Sno → Ssex,Sno → Sage , Sno → Sdept, Sno ←→ Sname, Sname → Ssex, Sname → Sage Sname → Sdept 但Ssex →Sage 备注: 1)若X→Y,并且Y→X, 则记为X←→Y。 2)若Y不函数依赖于X, 则记为X→Y。
函数依赖说明 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。 例如“姓名→年龄”这个函数依赖只有在不允许有同名人时成立。 例如,如果允许一个职工只有一个电话号码,那么,职工号确定了,则其电话号码也就随之确定了。 设计者可以对现实世界做强制规定; 关系模式的所有关系实例都要满足约束条件。
函数依赖分类及其定义 平凡函数依赖(Trivial FD) 非平凡函数依赖(Nontrivial FD) 完全函数依赖(Full FD) 部分函数依赖(Partial FD) 传递函数依赖(Transitive FD)
1)平凡函数依赖与非平凡函数依赖 在关系模式R(U)中,对于U的子集X和Y: 如果X→Y,但Y X,则称X→Y是非平凡的函数依赖; 如果X→Y,但Y X, 则称X→Y是平凡的函数依赖; 若X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素(Determinant)。 备注:对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,若不特别声明, 我们总是讨论非平凡函数依赖。
例1:在关系Student(Sno, Cno, Grade)中 (Sno, Cno) →Grade,但Grade (Cno,Sno) (Sno, Cno) → Sno,但Sno (Sno, Cno) 非平凡函数依赖: (Sno, Cno) →Grade 平凡函数依赖: (Sno, Cno) →Sno (Sno, Cno) → Cno
2)完全函数依赖与部分函数依赖 定义6.2 在R(U)中, 如果X→Y,并且对于X的任何一个真子集X’,都有X’→ Y, 则称Y对X完全函数依赖,记作X F→Y; 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X P→Y。
例1: 在关系SC(Sno, Cno, Grade)中 由于: (Sno, Cno) →Grade ,Sno →Grade,Cno → Grade 因此:(Sno, Cno) f→Grade(完全函数依赖) 由于: (Sno, Cno) →Sdept ,Sno → Sdept 故: (Sno, Cno) P →Sdept (部分函数依赖)
3)传递函数依赖 定义6.3 • 在R(U)中,如果X→Y (Y X) ,Y→X,Y→Z, 则称Z对X传递函数依赖。记为:X → Z; • 若上述定义中有Y→X,则X←→Y ,实际上为X→Z,是直接函数依赖而不是传递函数依赖。 传递
例1: 在关系Student(Sno, Sdept, Mname , cno , Grade)中,有 Sno→ Sdept, Sdept Sno ,(非平凡函数依赖) Sdept→sno,Sdept → Mname 则称:Mname传递函数依赖于Sno,记作Sno → Mname 传递
例:模式R(Sno,Sname,Sdept,Mname,Cno, Cname, Grade ),根据其语义,有如下函数依赖关系: 语义1:每个学生只会有一个学号; Sno→Sname 语义2:系与学生是一对多的关系;Sno→Sdept 语义3:系与系主任是一对一的关系; Sdept←→Mname 语义4:每门课程只有一个课程号; Cno→Cname 语义5:每个学生学习每门课程有一个成绩;(Sno,Cno)F→Grade 可推出: Sno 传递→ Mname • 省略部分函数依赖:如(Sno,Cno)P→Sname等
本次课总结 • 关系模型概念回顾 • 关系、关系模型、关系数据库、定义 • 关系模式中可能存在的异常(示例) • 数据冗余、插入异常、删除异常、更新复杂 • 关系模式中存在异常的原因 • 数据依赖(定义、分类)、函数依赖 • 关系模式的规范化 • 函数依赖(平凡、非平凡、完全、部分、传递函数依赖) • 范式
本次课内容 • 关系模式相关定义 • 关系模式规范化 • 1NF • 2NF • 3NF • BCNF
一、关系模式相关定义 • 定义6.4:设K为R(U,F)中的属性或属性组合。若K F→ U, 则K称为R的侯选码(Candidate Key);若候选码多于一个,则选定其中的一个做为主码(Primary Key); • 主属性与非主属性 • 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute) • 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute) • 最简单情况:一个属性是码; • 最极端情况:整个属性组是码,也称全码(ALL-KEY);
定义6.5 :关系模式 R 中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码; • 如在SC(Sno,Cno,Grade)中,Sno不是码,但Sno是关系模式S(Sno,Sdept,Sage)的码,则Sno是关系模式SC的外部码; • 主码与外部码一起提供了表示关系间联系的手段。
二、关系模式规范化 • 关系模式的好与坏,用什么标准衡量?这个标准就是模式的范式(Normal Forms,简记为NF); • 范式是符合某一种级别的关系模式的集合; • 范式的种类与数据依赖有着直接的联系,基于FD的范式有1NF、2NF、3NF、BCNF等多种。 • 某一关系模式R为第n范式,可简记为R∈nNF。
1NF 2NF 3NF BCNF 4NF 5NF • 各范式之间的关系
如果一个关系满足某个范式要求,则它也会满足较其级别低的所有范式的要求。如果一个关系满足某个范式要求,则它也会满足较其级别低的所有范式的要求。 • 一个低一级范式的关系模式,通过模式分解(投影运算)可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化; • 用几个简单的关系去取代原来结构复杂的关系的过程叫做关系规范化。规范化理论是围绕着范式建立的。
关系规范化 • 目的: 使结构合理,使数据冗余尽量小,减少插入,删除和更新异常; • 方法: 将关系模式投影分解成多个关系模式,但关系模式的分解不是唯一的; • 要求: 分解后的关系模式集合应当与原关系模式“等价”,既具有无损连接性,又保持函数依赖特性”.
1)第一范式1NF • 第一范式(1NF) • 当且仅当一个关系R中,每一个分量都是不可再分的数据项时, R∈1NF ; • 要求属性是原子的; • 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库; • 但是满足第一范式的关系模式并不一定是一个好的关系模式。
2)第二范式2NF • 定义6.6若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF ; 例1:判断关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade)是否满足2NF,其中Sloc为学生住处,假设每个系的学生住在同一个地方; 第一步:判断S-L-C是否为第一范式; 第二步:确定候选码(sno,cno); 第二步:确定所有函数依赖有: sno→sdept,sno →sloc,(sno,cno)P→sdept,(sno,cno)P→sloc,(sno,cno)F→Grade; 得出结论:和2NF定义相违背,故S-L-C不是2NF;
例2. 判断关系模式 sc(sno,sname,cno,grade)是否满足2NF; 第一步:判断sc是否为第一范式; 第二步:确定候选码(sno,cno); 第三步:确定所有函数依赖有: sno→sname , (sno,cno) P →sname ,(sno,cno) F→grade; 得出结论:和2NF定义相违背,故sc不是2NF;
一个关系模式不是2NF,就会产生以下问题(S-L-C):一个关系模式不是2NF,就会产生以下问题(S-L-C): • (1) 插入异常:假设Sno=95102,Sdept=IS,Sloc=N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入SLC。 • (2) 删除异常:假定某个学生本来只选修了3号课程这一门课。现在因其他原因,3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除。 • (3) 数据冗余度大:如果一个学生选修了10门课程,那么他的Sdept和Sloc值就要重复存储了10次。
(4) 修改复杂:例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部Sdept、Sloc信息。 • 原因:非主属性Sdept、 Sloc部分函数依赖于码。 • 解决方法:S-L-C分解为两个关系模式,以消除这些部分函数依赖 ;SC(Sno, Cno, Grade) S-L(Sno, Sdept, Sloc)
SLC Sno Sdept S-L SC Grade Sdept Sno Cno Sloc Sno Grade Cno Sloc 分解成2NF模式集的方法:投影分解法 S-L-C函数依赖图为: • SC(Sno, Cno, Grade)和S-L(Sno, Sdept, Sloc)
Sno Sname Grade Cno 例2. 分解关系模式 sc(sno,sname,cno,grade)为2NF; • 函数依赖图为: • 可分解为: 模式S(sno,sname) 模式SC(sno,cno,grade)
采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。 • 将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。如S-L(Sno, Sdept, Sloc) 。
3)第三范式3NF • 定义6.7 如果关系模式R是1NF,且每个非主属性都不传递依赖于R的候选码,那么称R是第三范式(3NF)的模式。 • 如果R∈3NF,则R也是2NF。 • 若 R∈3NF ,则每一个非主属性既不部分依赖于码也不传递依赖于码;
例1:判断2NF关系模式SC(Sno,Cno,Grade)及S-L(Sno, Sdept,Sloc)是否满足3NF; 模式sc的函数依赖有:(sno,cno)→grade 模式s-l的函数依赖有: sno →sdept,Sdept → Sno,sdept →sloc 故:模式sc为3NF,模式s-l依然为2NF;
例2:判断2NF关系模式S(sno,sname)及SC(Sno,Cno,Grade)是否满足3NF;例2:判断2NF关系模式S(sno,sname)及SC(Sno,Cno,Grade)是否满足3NF; 模式sc的函数依赖有:sno →sname 模式sc的函数依赖有:(sno,cno)→grade 故:模式s和sc皆为3NF;
Sno Sdept S-L Sdept Sloc Sdept Sno S-D D-L Sloc • 解决方法: 采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖: S-D(Sno, Sdept),D-L(Sdept,Sloc) • 分解后的关系模式S-D与D-L中不再存在传递依赖 • S-D(Sno,Sdept) ∈ 3NF,D-L(Sdept, Sloc)∈ 3NF