第3章 关系数据库设计理论 重点难点解析 典题例题 了解数据库设计中存在的问题 了解函数依赖的概念 掌握范式的使用方法 设计的数据库是否实用、高效?或者是否合理、正确?用户可以依据关系数据库设计理论进行核查。当然,在一般情况下,按照将ER模型转化为关系模式的理论方法进行数据库模式设计是不会出现太大问题的,那么关系数据库设计理论也可以验证或者解释转化原理的必要性和有效性。错误的或者不合理的关系模式必然会在数据库进行增、删、改、查操作时发生种种异常。范式及范式之间的关系是关系模式进行规约和转化的理论基础,是重点学习内容。 视频讲解 3.1数据库设计中存在的问题 数据库设计是否有据可依?为什么一定要遵循一定的原则?随意安排的一个关系模式到底容易出现哪些问题?例如设计学生关系模式S(SNO,SNAME,DEPT,HEAD,CNO,G),如图3.1所示,这个关系模式是否能满足基本的数据操作? 图3.1学生关系模式 SQL Server 2019数据库原理及应用微课视频版 第 3 章关系数据库设计理论 数据操作包括增、删、改、查4种,但分析来看,上面的关系模式在进行具体操作时会发生插入异常、删除异样、数据冗余和更新异常等问题。 (1) 插入异常: 如果一个系刚成立没有学生,或者有了学生但学生尚未选课,那么就无法将这个系及其负责人的信息插入数据库。 (2) 删除异常: 如果某个系的学生全部都毕业了,则删除该系学生及其选修课程的同时把这个系及其负责人的信息也删掉了。 (3) 数据冗余: 学生及其所选课程很多,而系主任只有一个,但其却要和学生及其所选课程出现的次数一样多。 (4) 更新异常: 如果某个系要更换系主任,就必须修改这个系的学生所选课程的每个元组,修改其中的系主任信息。若有疏忽,就会造成数据的不一致。 发生这些操作异常的原因是把多个实体型用一个关系模式表示,解决办法是将现有关系模式进行分解,如图3.2所示。 DEPT HEAD D01 李一 D02 王二 D03 赵三 图3.2分解后的关系模式 那么如何设计、验证和修改关系模式?首要的问题是将关系模式中各属性之间的关系分析清楚。一个关系模式中各属性之间的关系可以被分成存在函数依赖和不存在函数依赖两种。用户可以依据不同的依赖关系将关系模式修正,将具体操作中的诸多问题消除。 视频讲解 3.2函 数 依 赖 一个实体型的诸属性之间具有内在的联系。通过对这些联系进行分 析,可以做到一个关系模式只表示一个实体型的信息,从而消除上述问题。 在关系模型中,实体类型属性间这种既相互依赖又相互制约的关系称为数据依赖。 数据依赖是通过关系中属性值的相等与否体现出来的数据间的相互关系,它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。其中最重要的是函数依赖。 分析函数依赖关系可以改造性能较差的关系模式集合。 函数依赖极为普遍地存在于现实生活中。考查关系模式S(SNO,SNAME,DEPT,HEAD,CNO,G),由于一个SNO只对应一个学生,而一个学生只能在一个系中学习,所以当SNO的值确定后,SNAME和DEPT也被唯一确定了。就像自变量x确定后,相应的f(x)也被确定了一样。通常说SNO函数决定(SNAME,DEPT),而(SNAME,DEPT)函数依赖于SNO。 1. 关于函数的定义 (1) 函数依赖: 设R(U)是属性集U上的关系模式,X,YU,r是R(U)上的任意一个关系,如果对任意两个元组t,s∈r,若t[X]=s[X],则t[Y]=s[Y],那么称“X函数决定Y”或“Y函数依赖于X”,记作X→Y,称X为决定因素或决定属性集。 例如SNO→SNAME,(SNO,CNO)→G。 函数依赖是不随时间变化的。若关系R具有函数依赖X→Y,那么虽然关系R的值随时间变化,从而R[X,Y] 也会发生变化,但R[X,Y]在任一特定时刻仍保持为一个函数。 函数依赖与属性间的联系类型有关。当X、Y之间是“一对一”联系时,则存在函数依赖X→Y和Y→X; 当X、Y之间是“多对一”联系时,则存在函数依赖X→Y; 当X、Y之间是“多对多”联系时,则不存在函数依赖。 函数依赖不是指关系模式R的某个或某些元组满足的约束条件,而是指R的一切元组均要满足的约束条件。 函数依赖是现实世界中属性间关系的客观存在和数据库设计者的人为强制相结合的产物。 (2) 平凡函数依赖: 如果X→Y,但Y\ X,则称其为非平凡函数依赖,否则称其为平凡函数依赖。 例如(SNO,SNAME)→SNAME是平凡函数依赖。 (3) 部分函数依赖: 在R(U)中,如果X→Y,且对于任意X的真子集X′都有X′→/Y,则称Y对X完全函数依赖,记作XfY,否则称Y对X部分函数依赖,记作XpY。 (SNO,CNO)fG (SNO,CNO)pSNAME (4) 传递函数依赖: 在R(U)中,如果X→Y,Y→Z,且X不包含Y,Y→\ X,则称Z对X传递函数依赖。 【例3.1】SNO→DEPT,DEPT→HEAD,HEAD对SNO传递函数依赖。 2. 关于键的定义 (1) 超键: 设K为R(U,F)的属性或属性组,若K→U,则称K为R的超键。 【例3.2】SNO→U,(SNO,SNAME)→U。 (2) 候选键: 设K为R(U,F)的属性或属性组,若K满足以下条件,则称K为R的一个候选键。 条件1: K→U。 条件2: 不存在K的真子集Z使得Z →U成立。 或者: 设K为R(U,F)的超键,若KfU,则称K为R的候选键。 例如SNO→U。 (3) 主键: 若R(U,F)有多个候选键,则可以从中选择一个作为R的主键。 主键是唯一确定一个实体的最少属性的集合。 例如,S关系模式中的SNO; SC关系模式中的(SNO,CNO)。 (4) 键属性: 包含在任何一个候选键中的属性,称为键属性。 (5) 非键属性: 不包含在任何一个候选键中的属性,称为非键属性。 (6) 全键: 关系模式的键由整个属性组构成。 例如关系模式S(SNO,SNAME,DEPT,HEAD,CNO,G),主键为(SNO,CNO)。 【例3.3】指出关系模式S(SNO,SNAME,DEPT,HEAD,CNO,G)中的函数依赖。 (SNO,CNO)fG SNO→SNAME,(SNO,CNO)pSNAME SNO→DEPT,(SNO,CNO)pDEPT DEPT→HEAD,(SNO,CNO)pHEAD 视频讲解 3.3范式 范式是对关系的不同数据依赖程度的要求。如果一个关系满足 某个范式所指定的约束集,则称它属于某个特定的范式。 范式(简称NF)从低级到高级依次可分为1NF、2NF、3NF、BCNF、4NF、5NF乃至更高。范式之间的包含关系如图3.3所示。 图3.3范式之间的包含关系 下面将结合实例对范式及其相关概念进行解释。 1. 规范化 一个低一级范式的关系模式,通过模式分解可以转换为若干个高级范式的关系模式的集合,这一过程称为规范化。 2. 1NF 关系中的每一个分量必须是原子的,不可再分。即不能以集合、序列等作为属性值。 【例3.4】图3.4所示的关系是否满足第一范式?为什么?如何解决? 图3.41NF分解实例 图3.4(a)所示的关系不满足1NF,因为不满足原子性,分解成图3.4(b)后满足1NF。 3. 2NF 若R∈1NF,且每个非键属性完全依赖于键,则称R∈2NF。 将1NF的关系模式规范化为2NF的关系模式,其方法是消除1NF的关系模式中非键属性对键的部分依赖。 思考: 如果关系R的所有属性都是R的键属性,或者R的所有候选键都只含一个属性,那么R是否属于第二范式? 答: 属于2NF。因为R的所有候选键都只含一个属性,所以满足1NF; 但不存在非键属性,所以满足2NF的定义。 规范化到2NF的必要性见例3.5。 【例3.5】分析关系模式S(SNO,SNAME,DEPT,HEAD,CNO,G)在实际应用中有何问题?为什么?如何解决? 答: 不良特性如下。 插入异常: 如果学生没有选课,关于他的个人信息及所在系的信息就无法插入。 删除异常: 如果删除学生的选课信息,则有关他的个人信息及所在系的信息也随之删除了。 更新异常: 如果学生转系,若他选修了k门课,则需要修改k次。 数据冗余: 如果一个学生选修了k门课,则有关他的所在系的信息重复。 原因: S2NF,因为(SNO,CNO)pSNAME,(SNO,CNO)pDEPT。 解决办法: 规范化。 步骤: (1) 找出关系模式中所有的完全函数依赖。 (SNO,CNO)→G,SNO→SNAME,SNO→DEPT,DEPT→HEAD。 (2) 将满足完全函数依赖的属性关系划分到一个关系模式中。 SC(SNO,CNO,G)∈2NF S_SD(SNO,SNAME,DEPT,HEAD)∈2NF 4. 传递函数依赖 在关系模式R(U)中,如果X→Y,Y→Z,并且X不包含Y,Y→\ X,则称Z对X传递函数依赖。 5. 3NF 在关系模式R(U,F)中,若不存在这样的键X、属性组Y及非键属性Z(Z\ Y),使得X→Y、Y→Z、Y→\ X成立,则称R∈3NF。 将2NF的关系模式规范化为3NF的关系模式,其方法是消除2NF的关系模式中非键属性对键的传递依赖。 2NF规范化到3NF的必要性见例3.6。 【例3.6】关系模式S_SD(SNO,SNAME,DEPT,HEAD)在实际应用中有何问题?为什么?如何解决? 答: 不良特性如下。 插入异常: 如果系中没有学生,则有关系的信息就无法插入。 删除异常: 如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。 更新异常: 如果学生转系,不仅要修改DEPT,还要修改HEAD,如果换系主任,则该系的每个学生元组都要做相应修改。 数据冗余: 每个学生都存储了所在系的系主任的信息。 原因: S_SD3NF,因为SNO→DEPT,DEPT→HEAD。 解决办法: 规范化。 步骤: (1) 找出传递依赖关系。 (2) 在原关系模式中去除传递依赖主属性的属性,并将起传递作用的属性和其决定的属性组成新的关系模式。 将S_SD分解为STUDENT(SNO,SNAME,DEPT), DEPT(DEPT,HEAD)。 6. BCNF范式 若关系模式R(U,F)∈1NF,如果对于R的每个函数依赖X→Y,且Y\ X时,X必含有键,则R(U,F)∈BCNF。 由BCNF的定义可以看到,每个BCNF的关系模式都具有以下3个性质: (1) 所有非键属性都完全函数依赖于每个候选键。 (2) 所有键属性都完全函数依赖于每个不包含它的候选键。 (3) 没有任何属性完全函数依赖于非键的任何一组属性。 也就是说,如果关系模式R的每一个决定因素都包含键,则R属于BCNF范式(不存在非键决定因素)。 【例3.7】有STJ(S,T,J),S表示学生,T表示教师,J表示课程。每个教师只教一门课,每门课由若干教师教,某一学生选定某门课就确定了一个固定的教师,因此具有函数依赖T→J,(S,J)→T,(S,T)、(S,J)为候选键。请问STJ在实际应用中有何问题?为什么?如何解决?满足BCNF范式吗? 答: 不良特性如下。 插入异常: 如果没有学生选修某个教师的任课,则该教师担任课程的信息就无法插入。 删除异常: 删除学生选课信息,会删除掉教师的任课信息。 更新异常: 如果教师所教的课程有所改动,则所有选修该教师课程的学生元组都要做改动。 数据冗余: 每位学生都存储了有关教师所教的课程的信息。 原因: 键属性对键的不良依赖。如STJBCNF,因为T→J,而T不含有键。 改造: 将STJ分解为(S,T),(T,J)。 【例3.8】考虑两个关系,分析它们是否满足3NF和BCNF范式。 (1) 关系模式S(S#,SNAME,SADD,SAGE),限制SNAME唯一; (2) 关系模式SS(S#,SNAME,C#,G),限制SNAME唯一。 答: 在S(S#,SNAME,SADD,SAGE)中,键为S#和SNAME,且除此以外无其他决定因素,是3NF范式和BCNF范式。 在SS(S#,SNAME,C#,G)中,键为(S#,C#)和(SNAME,C#),非主属性G不传递任何候选键,所以SS是3NF范式,但它不是BCNF范式。因为S#→SNAME,S#不是SS的候选键。 一个关系数据库模式中的关系都属于BCNF,则在函数依赖的范畴内已实现了彻底的分离,消除了插入、删除和修改的异常。3NF的“不彻底”性表现在当关系模式具有多个候选键,且这些候选键具有公共属性时,可能存在主属性对键的部分依赖和传递依赖。 关系模式的属性之间除了函数依赖以外,还存在多值依赖关系。 【例3.9】有关系模式TEACH(C#,P#,B#),一门课程由多个教师担任,一门课程使用相同的一套参考书,如图3.5所示。它是否属于BCNF范式?在实际应用中有何问题? 图3.5TEACH关系模式 答: 它的键是(C#,P#,B#),是全键,没有函数依赖关系,所以属于BCNF范式。 其不良特性如下。 插入异常: 当某门课程增加一个教师时,该门课程有多少本参考书就必须插入多少个元组; 同样,当某门课程需要增加一本参考书时,它有多少个教师就必须插入多少个元组。 删除异常: 当删除一门课程的某个教师或者某本参考书时,需要删除多个元组。 更新异常: 当一门课程的教师或参考书作出改变时,需要修改多个元组。 数据冗余: 同一门课的教师与参考书的信息被反复存储多次。 7. 多值依赖 (1) 描述型定义: 设R(U)是属性集U上的一个关系模式,X、Y、Z是U的子集,并且Z=U-X-Y,关系模式R(U)中多值依赖X→→Y成立,当且仅当在R(U)的任一关系r中,对于给定的X属性值,都有一组Y的值与之对应,而与其他属性Z值无关。 例如在关系模式TEACH中,对(物理,普通物理学)有一组P#值(张明,张平),对(物理,光学原理)也有一组P#值(张明,张平),这组值仅取决于C#的取值,而与B#的取值无关。因此,P#多值依赖于C#,记作C#→→P#,同样有C#→→B#。 (2) 形式化定义: 在R(U)的任一关系r中,如果存在元组t、s,使得t[x]=s[x],那么就必然存在元组w,v∈r(w、v可以与s、t相同),使得: w[X]=s[X]=v[X]=t[X] w[Y]=t[Y],v[Y]=s[Y] w[Z]=s[Z],v[Z]=t[Z] 则称Y多值依赖于X,记作X→→Y。 若(C#,P#,B#)满足C#→→P#,含有元组t=(物理,张明,普通物理学),s=(物理,张平,光学原理),则也一定含有元组w=(物理,张明,光学原理),v=(物理,张平,普通物理学)。 多值依赖有如下性质: (1) 多值依赖具有对称性,即若X→→Y,则X→→Z,其中Z=U-X-Y。 (2) 函数依赖是多值依赖的特例,即若X→Y,则X→→Y。 (3) 若X→→Y,U-X-Y=φ,则称X→→Y为平凡的多值依赖。 函数依赖与多值依赖的区别如下: X→Y的有效性仅决定于X、Y属性集上的值,它在任何属性集W(XYWU)上都成立。 若X→Y在R(U)上成立,则对于任何Y′Y,均有X→Y′成立。 X→→Y的有效性与属性集范围有关。 X→→Y在属性集W(XYWU)上成立,但在U上不一定成立。 X→→Y在U上成立X→→Y在属性集W(XYWU)上成立。 若在R(U)上,X→→Y在属性集W(XYWU)上成立,则称X→→Y为R(U)的嵌入式多值依赖。 若X→→Y在R(U)上成立,则不能断言对于Y′Y是否有X→→Y′成立。 8. 4NF 关系模式R(U,F)∈1NF,如果对于R到每个非平凡的多值依赖X→→Y(Y\ X),X都含有键,则称R∈4NF。 4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。因为根据定义,对于每一个非平凡的多值依赖X→→Y,X都含有候选键,于是就有X→Y,所以4NF允许的非平凡的多值依赖实际上是函数依赖。 例如关系模式CPB,C#→→P#,C#→→B#,键为(C#,P#,B#),所以CPB4NF。如果一门课Ci有m个教师、n本参考书,则关系中分量为Ci的元组共有m×n个,数据冗余非常大。 改造: 将CPB分解为CP(C#,P#),CB(C#,B#),在分解后的关系中分量为Ci的元组共有m+n个,如图3.6所示。 C# B# 物理 普通物理学 物理 光学物理 化学 无机化学 CPCB C# P# 物理 张明 物理 张平 化学 张明 图3.64NF分解实例 3.4范式之间的关系 在3.3节中,对于范式的定义,并未全部说明此范式满足上一级范式,本节将证明范式之间的包含关系是对的,即4NFBCNF3NF2NF1NF。 证明3.1: 3NF2NF 证明: 反证法。 若R∈3NF,但R2NF,则按2NF的定义,一定有非键属性部分依赖于键。 设X为R的键,则存在X的真子集X′,以及非键属性Z(ZX′),使得X′→Z。 于是在R中存在键X、属性组X′以及非键属性Z(ZX′),使得X→X′,X′→\ Z,(X′→X),X →Z成立,这与R∈3NF矛盾,所以R∈2NF。 证明3.2: BCNF3NF 证明: 反证法。 若R∈BCNF,但R3NF,则按3NF的定义,一定有非键属性对键的传递依赖,于是存在R的键X、属性组Y以及非主属性Z(ZY),使得X→Y,Y→Z,Y→\ X成立。 由Y→Z,按BCNF的定义,Y含有键,于是Y→X成立,这与Y→\ X矛盾,所以R∈3NF。 小结 平凡函数依赖: 如果X→Y,但Y\ X,则称其为非平凡函数依赖,否则称为平凡函数依赖。例如(SNO,SNAME)→SNAME是平凡函数依赖。 部分函数依赖: 在R(U)中,如果X→Y,且对于任意X的真子集X′都有X′→\ Y,则称Y对X完全函数依赖,记作XfY,否则称Y对X部分函数依赖,记作XpY。例如 (SNO,CNO)fG,(SNO,CNO)pSNAME。 传递函数依赖: 在R(U)中,如果X→Y,Y→Z,且X不包含Y,Y→\ X,则称Z对X传递函数依赖。 1NF的主要判断依据是每个属性是否满足原子性。 2NF的主要判断依据是所有非键属性必须完全函数依赖于键。 3NF的主要判断依据是属性之间不存在传递函数依赖。 BCNF的主要判断依据是起决定作用的属性必须包含键。 BCNF之前的所有范式适用于规范两个实体及其之间的关系。4NF是用来规范3个实体之间的关系的,做法一般是将模式分解为两两实体之间的关系。 范式之间的关系是4NFBCNF3NF2NF1NF。 范式是检查数据库设计是否合理的标准,函数依赖是理解范式的重要概念。各级别的范式规范是解释数据库设计所遵循的理论的重要依据。 课后题 一、 选择题 1. 关系模式中数据依赖问题的存在可能会导致库中数据插入异常,这是指()。 A. 插入了不该插入的数据 B. 数据插入后导致数据库处于不一致状态 C. 该插入的数据不能实现插入 D. 以上都不对 2. 关系模式中的候选键()。 A. 有且仅有一个 B. 必然有多个 C. 可以有一个或多个 D. 以上都不对 3. 在规范化的关系模式中,所有属性都必须是()。 A. 相互关联的B. 互不相关的 C. 不可分解的D. 长度可变的 4. 设关系模式R属于第一范式,若在R中消除了部分函数依赖,则R至少属于()。 A. 第一范式B. 第二范式 C. 第三范式D. 第四范式 5. 若关系模式R中的属性都是主属性,则R至少属于()。 A. 第三范式B. BC范式 C. 第四范式D. 第五范式 二、 填空题 1. 一个不好的关系模式会存在异常、异常和等弊端。 2. 设X→Y为R上的一个函数依赖,若,则称Y完全函数依赖于X。 3. 包含R中所有属性的候选键称。不在任何候选键中的属性称。 4. Armstrong公理系统是的和的。 5. 第三范式是基于依赖的范式,第四范式是基于依赖的范式。 三、 简答题 1. 解释下列术语的含义: 函数依赖、平凡函数依赖、非平凡函数依赖、部分函数依赖、完全函数依赖、传递函数依赖、范式、无损连接性、依赖保持性。 2. 给出2NF、3NF、BCNF的形式化定义,并说明它们之间的区别和联系。 3. 试证明全码的关系必是3NF,也必是BCNF。 4. 要建立关于系、学生、班级、研究会等信息的一个关系数据库,规定一个系有若干专业,每个专业每年只招一个班; 每个班有若干学生,一个系的学生住在同一个宿舍区; 每个学生可参加若干研究会,每个研究会有若干学生; 学生参加某研究会,有一个入会年份。 描述学生的属性有学号、姓名、出生年月、系名、班号、宿舍区。 描述班级的属性有班号、专业名、系名、人数、入校年份。 描述系的属性有系号、系名、系办公室地点、人数。 描述研究会的属性有研究会名、成立年份、地点、人数。 试给出上述数据库的关系模式; 写出每个关系的最小依赖集(即基本的函数依赖集,不是导出的函数依赖); 指出是否存在传递函数依赖; 对于函数依赖左部是多属性的情况,讨论其函数依赖是完全函数依赖还是部分函数依赖,指出各关系的候选键、外部键。