• 第6章:关系数据库理论(考研重点)


    第6章:关系数据库理论(考研重点)

    代码是基于SQLServer学习,与MySQL有略微差别!
    考研复试或者考研科目中可能会考!

    6.1、问题的提出

    举例:

    • 我们要开发一个教务管理系统,信息有:学号,姓名,课号,课名,成绩。
    • 首先应该设计数据库来存储信息。
    • 针对这个具体系统,应该如何构造一个适合于它的数据库模式,即应该构造几个关系模式,每个关系模式由哪些属性组成等——关系数据库逻辑设计问题

    设计一个数据库,只有一个关系模式:

    • SC(SNO, SNAME, CNO, CNAME, G)
      • 主码:(SNO,CNO)
    • 存在问题:
      • 冗余度大;e.g:每次插入重复sname、cname
      • 更新异常;e.g:修改课名时,只修改了一个
      • 插入异常;e.g:新添加一个学生,但是没有选课,cno为null;或者新加一门课,但没有学生选,sno为null
      • 删除异常;e.g:删除一名学生的时候,连带着课程也一起跟着删除,可能会导致该课程的缺失

    一个好的关系数据库模式应该具备以下四个条件:

    1. 尽可能少的数据冗余。
    2. 没有插入异常。
    3. 没有删除异常。
    4. 没有更新异常。

    问题的解决方案:

    • 对关系模式
      SC(SNO,SNAME,CNO,CNAME,G)
      进行分解;分为下面三个关系模式
      • S( SNO, SNAM );
      • C( CNO, CNAME );
      • SC( SNO, CNO, G )

    这样是否能解决问题?理论基础是什么?

    答:能,关系的规范化理论

    6.2、规范化

    6.2.1、关系的规范化概述

    • 将结构复杂的关系模式分解成结构简单的关系模式,从而把不好的关系数据库模式转变为好的关系数据库模式,这就是关系的规范化。

    • 指导关系的规范化有一套完整的理论,称为关系规范化理论。

      • 关系数据库模式之所以不好是因为其中有不合适的数据依赖
      • 规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
      • 关系规范化理论是以数据依赖为基础的。

    关系模式可以形式化的表示为
    R(U, D, dom, F)

    字母 含义
    R 关系名
    U 组成该关系的属性名集合
    D 属性组U中属性所来自的域的集合
    dom 属性向域的映像集合
    F 属性间数据依赖的集合

    在本章中关系模式简记为R(U, F)

    6.2.2、数据依赖

    数据依赖:关系模式中的各属性之间相互依赖、相互制约的联系
    数据依赖是语义的体现

    模式分解的目的就是消除不好的函数依赖(部分函数依赖、传递函数依赖)

    建立一数据库来存储教务有关信息:

    • 学号:Sno、院系名:Sdept、系主任:Mname、课程号:Cno、课程名:Cname、成绩:Grade
    • 单一的关系模式 : S(U, F)
      U ={Sno, Sdept, Mname, Cno, Cname, Grade}
      F是什么?
    U={ Sno,Sdept,Mname,Cno,Cname,Grade }
    数据库的语义: 
    一个学生只属于一个系,一个系有若干学生;
    Sdept = f(Sno) (Sno --> Sdept)
    一个系只有一名系主任;
    Sdept --> Mname
    一个学生可以选修多门课程, 每门课程有若干学生选修;每个学生所学的每门课程都有一个成绩。
    (Sno, Cno) --> Grade
    F={ Sno-->Sdept, Sdept-->Mname,(Sno, Cno)-->Grade }
    

    数据依赖一般分为

    • 函数依赖( Functional Dependency, 简记为FD )
    • 多值依赖(Multivalued Dependency,简记为MVD)
    • 连接依赖

    其中,函数依赖是最重要的数据依赖。

    6.2.3、函数依赖

    定义设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系 r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X → Y

    Y函数依赖于X 等价于下面:

    • 只要X相等Y就相等
    • 只要Y不相等, X就不相等

    对于关系模式:SCD{ SNO,SN,AGE,DEPT,MN,CNO,SCORE }

    • SNO → SN
    • SNO → AGE
    • SN → AGE:学生有重名的情况下,age 不函数依赖与 sn
    • SNO →DEPT
    • DEPT → MN
    • SNO → MN
    • SNO → SCORE:学生可能有多门课的成绩,因此 score 不函数依赖于 sno
    • (SNO,CNO) → SCORE

    几个术语和记号

    • 决定因素、依赖因素

      若X→Y,我们称X为决定因素,Y为依赖因素。

    • X←→Y

      若X→Y,Y→X,则记作X←→Y

    • X ↛ Y

      若Y不函数依赖X,则记作X ↛ Y

    函数依赖的几点说明

    1、函数依赖是语义的体现,我们只能根据语义来确定一个函数依赖。

    对于关系模式:SC{SNO, SN, AGE, CNO, SCORE}

    • 语义1:学生可以重名 SN ↛ AGE
    • 语义2:学生不可以重名 SN → AGE
    • 语义3:一名学生可以选多门课: SNO ↛ CNO
    • 语义4:一名学生只可以选一门课:SNO → CNO

    2、平凡的函数依赖与非平凡的函数依赖。

    当属性集Y是属性集X的子集时,则必然存在着函数依赖X→Y,这种类型的函数依赖称为平凡的函数依赖。

    • (Sno, Sage) → Sno
    • (Sno, Sage) → Sage
    • (Sno, Sage) → (Sno, Sage)

    如果Y不是X的子集,则称X→Y为非平凡的函数依赖。

    对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声

    明, 我们总是讨论非平凡函数依赖。

    3、函数依赖与属性之间的联系类型有关。

    在一个关系模式中,如果属性X与Y有1:1联系时, 则存在函数依赖X→Y, Y→X, 即X←→Y。

    • 当学生无重名时,SNO与SN有1:1联系, SNO ←→ SN

    在一个关系模式中,如果属性Y与X有1:m的联系时,则存在函数依赖X→Y。

    • AGE与SNO之间1:m联系,所以有SNO→AGE。

    所以在确定属性间的函数依赖关系时,可以从分析属性间的联系类型入手,便可确定属

    性间的函数依赖。

    函数依赖的基本性质

    1、传递性

    • 若X→Y,Y→Z ,则有X→Z
    • 证明:任意两个元组u, v, 假设其X部分相等。
      两个元组u, v的X部分相等,则有Y部分相等(因为X→Y),那么Z部分也肯定相等(因为Y→Z )。
      所以X→Z 。

    2、扩张性

    • 若X→Y且W→Z,则(X,W)→(Y,Z)。
    • 例如,对关系模式
      SC(SNO,SNAME,AGE, CNO,CNAME,G)
      有SNO→(SNAME,AGE),CNO→CNAME
      则有(SNO,CNO)→(SNAME,AGE,CNAME)

    3、合并性

    • 若X→Y且X→Z则必有X→(Y,Z)。

    • 例如,对于关系模式
      SCD{SNO,SN,AGE,DEPT,MN,CNO,CORE}
      SNO→(SN,AGE),SNO→(DEPT,MN),
      则有SNO→(SN, AGE, DEPT, MN)。

    4、分解性

    • 若X→(Y,Z),则X→Y且X→Z。
    • 分解性为合并性的逆过程。

    完全函数依赖、部分函数依赖、传递函数依赖

    (重点)定义

    • 在关系模式R(U)中,如果X → Y,并且对于X的任何一个真子集X',都有X'↛ Y, 则称 Y完全函数依赖于X,记作X→Y。

    • 在关系模式R(U)中,若X → Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X→Y。
      例如,对关系模式:SC(SNO,SNAME,AGE, CNO,CNAME,GRADE)

      • (SNO,CNO) →^F^ GRADE
      • (SNO,CNO) →^P^ AGE
    • 在关系模式R(U)中,如果X→Y,Y→Z,且Y ⊈ X,Z ⊈ Y,Y ↛ X,则称Z传递函数依赖于X。

    6.2.4、码

    • 超码:

      • 超码由一个或多个属性组成的一个属性集,这个属性集可以唯一确定关系中的每一个元组。
        • 学号
        • (学号,姓名)
      • 如果K是超码,则K的任意超集也是超码。
    • 候选码:如果一个超码的任意真子集都不能成为超码,这样的最小超码称为候选码。

    • 主码:候选码可能有多个,数据库设计人员选中的用来标识每一个元组的候选码称为主码。

    • 主属性:包含在任何一个候选码中的属性。

    • 非主属性:不包含在任何一个候选码中的属性。

    • 全码

      • 最简单的情况下,单个属性构成码。
      • 最复杂的情况下,一个关系的全部属性构成码,称为全码。

    例:

    S(Sno, Sname, Sdept ),  
    Sno 是码,Sno主属性。
    非主属性:Sname, Sdept
    SC(Sno,Cno,G)
    (Sno ,Cno)是码,  所以Sno与Cno是主属性,
    G是非主属性。 
    
    • K是R(U, F) 的属性或属性集合。若 K →^F^ U,则称K为R的侯选码(Candidate key)。
      例:S(U, F), U = {Sno,Sname, Sdept }
      F = {Sno→Sname, Sno→Sdept}
      有 Sno→^F^ U,所以Sno是S的候选码;

      (Sno,Sname)是候选码吗?不是,(Sno,Sname) →^P^ U

    6.2.5、范式

    针对同一个数据库问题不同的人设计出来的关系模式不完全相同。

    Q:用什么标准来衡量关系模式的好坏?

    A:范式

    • 范式是符合某一种级别的关系模式的集合。

    范式的种类:

    1、第一范式(1NF)

    2、第二范式(2NF)

    3、第三范式(3NF)

    4、BC范式(BCNF)

    5、第四范式(4NF)

    6、第五范式(5NF)

    各种范式之间存在联系:

    5NF ⊂ 4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF

    某一关系模式R为第n范式,可简记为R ∈ nNF

    规范化:一个属于低一级范式的关系模式,通过分解可以转化为若干个属于高一级范式的关系模式。这个过程就是规范化。

    1NF

    1NF的定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

    • 第一范式是对关系模式的最起码的要求。不满足第一范式就不能称之为关系模式。
    • 但是满足第一范式的关系模式并不一定是一个好的关系模式。属于1NF可能存在数据冗余和各种异常。

    例: 关系模式 SLC

    Sno:学号;Sn:学生姓名;Dno:系别号;Dloc:系的位置;Dn:系名;Cno:课程编号;Cn:课程名称;Grade:分数;

    • SLC(Sno,Sn,Dno,Dn,Dloc,Cno,Cn,Grade)
    • (SNO,CNO)为码
    • 存在问题
      • 数据冗余
      • 更新异常
      • 插入异常
      • 删除异常

    2NF

    2NF的定义:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。

    2NF的定义还可以等价如下内容:

    从1NF到2NF:消除非主属性对码的部分函数依赖

    • SLC(Sno,Sn,Dno,Dn,Dloc,Cno,Cn,Grade):不属于 2NF
      (Sno, Cno)为码
    • 非主属性
      Dno, Sn, Dn, Dloc, Cn, Grade
    • 数据依赖

    (Sno, Cno)→^F^ Grade

    (Sno, Cno)→^P^ Dno

    (Sno, Cno)→^P^ Dn

    (Sno, Cno)→^P^ Cn

    (Sno, Cno)→^P^ Dloc

    (Sno, Cno)→^P^ Sn

    投影分解法:

    • 采用投影的方式进行分解。
    • 分解时遵循的基本原则就是:让一个关系只描述一个实体或者只描述实体间的一种联系。
    • 主要目的消除不合适的函数依赖。

    SLC(Sno,Sn,Dno,Dn,Dloc,Cno,Cn,Grade)
    分解为如下三个关系模式

    • SD(Sno, Sn, Dno, Dn, Dloc)
      Sno为码
    • C(Cno, Cn)
      Cno为码
    • SC(Sno, Cno, Grade)
      (Sno, Cno)为码

    都属于2NF,将一个1NF关系模式分解为多个2NF的关系模式,并不能完全消除关系模式中的数据冗余和各种异常情况

    3NF

    3NF的定义:关系模式R(U, F)中若不存在这样的码X、属性组Y及非主属性Z(Z Y), 使得X→Y, Y↛ X, Y→ Z成立,则称R(U,F)∈3NF

    3NF的定义还可以等价如下内容:

    如果关系模式R中不存在非主属性部分函数依赖于码, 也不存在非主属性传递函数依赖于码, 则称模式R∈3NF

    其实也就是说关系R中的所有非主属性都完全函数依赖于码,也直接函数依赖于码;

    从3NF中我们可以得到如下结论:

    1、结论一:

    如果关系模式R ∈ 3NF,则R中每一个非主属性完全函数依赖于码。

    2、结论二:

    如果关系模式R ∈ 3NF,则R中每一个非主属性不传递函数依赖于码

    3、结论三:

    如果关系模式R中每一个非主属性既不部分函数依赖于码也不传递函数依赖于码,则R ∈ 3NF

    例如:SLC(Sno,Sn,Dno,Dn,Dloc,Cno,Cn,Grade)
    分解为如下三个关系模式

    • SD( Sno, Sn, Dno, Dn, Dloc )
    • C(Cno, Cn)
    • SC(Sno, Cno, Grade)

    都属于2NF,其中对于关系模式SD,

    Sno→Dno,Dno→Dn,Dno ↛ Sno,Dn传递函数依赖于Sno。所以SD不属于3NF

    对上面SD分解(投影分解)

    • S(Sno, Sn, Dno)
    • D(Dno, Dn, Dloc)
    • C(Cno, Cn)
    • SC(Sno, Cno, Grade)

    都属于3NF,解决了冗余异常问题

    1)设计数据库存储如下信息:
    信息:学生(Sno, Sn),教师(Tno, Tn),课程(Jno, Jn)。

    • 每一名教师只教一门课,每门课由若干教师教。
    • 每个学生可以选修多门课,一门课可以被多个学生选修。
    • 某一学生选修某门课时,要指定选修哪个老师教的这门课,学生一旦选修了某个老师教的这门课,就不能再选修别的老师教的这门课。

    2)设计关系模式。

    • S(Sno, Sn), T(Tno, Tn), J(Jno, Jn)

    • STJ(Sno, Jno, Tno)

    STJ中的函数依赖:

    • Tno →^F^ Jno,(Sno,Tno) →^P^ Jno,
    • Jno ↛ Tno
    • Sno ↛ Tno,Tno ↛ Sno
    • (Sno,Jno) →^F^ Tno

    3)STJ(Sno, Jno, Tno)属于几范式 答:3NF
    STJ中的数据依赖

    • Tno→Jno, (Sno,Tno)→Jno
    • (Sno,Jno)→Tno

    STJ中的候选码

    • Tno、Sno和 Jno,每一个单独能不能作为候选码?不能
    • (Tno, Jno)能不能作为候选码? 不能
    • (Sno,Tno)和(Sno,Jno)能不能作为候选码?能
      • (Sno,Tno) →^F^ U (Sno,Jno) → ^F^ U
    • STJ没有非主属性, STJ ∈ 3NF

    STJ(Sno, Jno, Tno)存在问题:

    1. 假设刘老师(T1)教数据库(J1),有200个学生选修刘老师教的数据库,J1和T1的联系将出现200次
    2. 学生选课前,J1和T1的联系不能体现在数据库中。
      (Sno,Tno)和(Sno,Jno)为候选码

    在STJ中出现的问题表明需要更高级别的范式进行模式分解!

    在实际工作建表的过程中,达到 3NF 即可!

    BCNF

    BCNF的定义:

    • 设关系模式R(U, F)∈1NF,如果对于R的每个函数依赖X→Y,若Y X,则X必含有码,那么R(U, F) ∈ BCNF。
    • 设关系模式R(U, F)∈1NF,如果R中的每一个非平凡的函数依赖的决定因素都包含码,则R(U, F) ∈ BCNF

    对于关系模式STJ(Sno,Jno,Tno) ,候选码:(Sno,Tno), (Sno,Jno)
    STJ中的数据依赖

    • Tno→ Jno
    • (Sno,Tno)→Jno (Jno)主属性对不包含该主属性的码的部分函数依赖
    • (Sno,Jno)→Tno

    对于Tno→Jno,但Tno中不含有码,STJ不属于BCNF。

    从BCNF范式中,可以得出以下结论:

    1、结论一:如果R ∈ BCNF,则R ∈ 3NF。

    2、结论二:R ∈ BCNF,则R中不存在主属性对不包含该主属性的码的部分函数依赖。

    下面尝试进行模式分解:

    方案一:

    把STJ(Sno, Jno, Tno)分解

    • TJ( Tno, Jno )
    • SJ( Sno, Jno)

    分解不合理,原先的语义丢失

    举例:在SJ(Sno,Jno)中,学生S1选了J1这门课,但是一门课可以被多个老师教,也就造成了学生S1选的J1这门课不知道是哪位老师教的。

    方案二:

    把STJ(Sno, Jno, Tno)分解

    • TJ( Tno, Jno )
    • ST( Sno, Tno)

    对于TJ ( Tno, Jno )

    • 码为Tno
    • Tno→Jno
    • ∈ BCNF

    对于ST ( Sno, Tno)

    • 码为(Sno,Tno)
    • (Sno,Tno)→Sno (Sno,Tno) → Tno
    • 没有非平凡的函数依赖,而平凡的函数依赖我们不讨论,所以 ∈ BCNF

    解决了STJ中存在的问题。

    如果上面的定义看蒙了,可以直接记住这些范式的要求即可:

    前3个范式都是对非主属性进行讨论的

    总结:

    1NF:关系模式中的所有属性列都是不可再分的数据项

    2NF:每一个非主属性都完全函数依赖于码

    3NF:每一个非主属性既完全函数依赖于码也直接函数依赖于码

    BCNF:每一个主属性对不包含该主属性的码要完全函数依赖,主属性对码要直接函数依赖

    4NF:对于每个多值依赖X→→Y (U-X-Y ≠ Ø 且Y ⊊ X),则必有函数依赖X→Y

    6.2.6、多值依赖

    ∈ BCNF的关系模式是否完美呢?

    ​ 如果一个关系数据库中所有关系模式都属于BCNF,那么在函数依赖的范畴内,已经实现了模式的彻底分解,消除了异常的根源,而且数据冗余也减少到极小程度但在其他数据依赖的范畴内有可能仍然存在问题。多值依赖

    设计数据库存储如下信息

    • 课程:Cno, Cn;教师:Tno, Tn;参考书:Bno, Bn
    • 语义: 学校中某一门课程由多个教师讲授,一个教师可以讲授多门课;不同教师讲授同一门课时使用相同的一套参考书,一本参考书可以被多门课使用。

    关系模式

    • C(Cno,Cn); T(Tno, Tn); B(Bno, Bn)
    • CTB(Cno, Tno, Bno)

    数据:

    • 两门课:C1(数学)、C2(物理);
    • 三名教师:T1(李勇)、T2(王军)、T3(张平);李勇教物理和数学,王军教物理,张平教数学。
    • 物理的参考书:B1(普通物理学)、B2(光学原理)、B3(物理习题集);
    • 数学的参考书:B4(数学分析)、B5(微分方程)、B6(高等代数);

    考虑CTB(Cno, Tno, Bno)对应的关系中有多少元组?12个

    在这里插入图片描述
    在这里插入图片描述

    在关系模式CTB中,码是什么?

    • 单独的Cno、Tno、Bno都不行,无法唯一标识每一个元组
    • (Cno,Tno)也不行,(Cno,Bno)也不行,(Tno,Bno)也不行,虽然上图中(Tno,Bno)看着没有重复的,但是一本参考书可以被多门课程使用;

    在这里插入图片描述
    所以得出结论,在关系模式CTB中,码为全码(Cno,Tno,Bno)

    关系模式CTB(Cno, Tno, Bno)的候选码:

    • 全码

    CTB(Cno, Tno, Bno)属于第几范式

    • 由于是全码,没有非主属性,CTB ∈ 3NF
    • 没有主属性对不包含该主属性的码的部分函数依赖
    • 没有主属性对码的传递函数依赖
      CTB ∈ BCNF

    如下是在CTB关系模式中插入的一些数据:

    在这里插入图片描述

    CTB(Cno, Tno, Bno)存在的问题

    • 数据冗余度大
    • 插入异常
    • 删除异常
    • 修改异常

    对于关系模式CTB(Cno, Tno, Bno)在函数依赖的范畴内不存在任何问题。

    但CTB存在不合理的多值依赖,只有消除这些不合理的多值依赖才能 ∈ 4NF。

    (Cno,Tno)与Bno之间有什么样的制约联系?

    • 对于(Cno,Tno),给定一个值(C1,T1), Bno有一组值{B1, B2, B3}与之对应。
    • 对于(Cno,Tno),给定另外一个值(C1,T2),Bno有同样一组值{B1, B2, B3}与之对应。
    • 给定(Cno,Tno)合理的一些值,只要Cno相同,不管Tno取什么值,那么Bno就一直有同样一组值与之对应
    • 这时称Bno多值依赖Cno: Cno →→ Bno

    多值依赖的定义:设R(U)是一个属性集U上的一个关系模式, X、Y和Z是U的子集,并且Z=U-X-Y,多值依赖X→→Y成立,当且仅当对R的任一关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。

    对于(X, Z)上的一些值,只要X部分相等,不管Z部分取何值, Y都有相同的一组值与之对应,就有X→→Y 。( Z=U-X-Y )

    1、CTB(Cno,Tno,Bno),考虑Bno是否多值依赖Cno?yes

    课程号对应一组的参考书,而与老师无关,也就是说不管哪个老师来教哪门课程,参考书是不变的;

    2、CTB(Cno, Tno, Bno)有没有Tno多值依赖Cno?yes

    课程号对应一组老师,而与参考书无关,也就是说教哪门课的老师是固定的,与选取哪些参考书无关;

    3、对于关系模式CTB(Cno, Tno, Bno),假设不同的老师教同一门课时可以使用不同的参考书,这时有没有Bno多值依赖Cno?no

    根据定义来判断,教同一门课使用不同的参考书,不是多值依赖;

    多值依赖的另一个等价的形式化的定义:

    在R(U)的任一关系r中, 如果存在元组t, s使得t[X]=s[X], 那么就必然存在元组w, v ∈ r, 使得w[X]=v[X]=t[X],而w[Y]=t[Y], w[Z]=s[Z], v[Y]=s[Y], v[Z]=t[Z], 则Y多值依赖于X, 记为X→→Y。 这里X, Y是U的子集, Z=U-X-Y。

    定义的理解(重点理解): 对r中任意两个元组t和s, 若t[X]=s[X], 那么交换t, s的Y值部分得到的两个元组也在r中。

    多值依赖的性质

    1、假设Z=U-X-Y = ∅,则肯定有X→→Y。这样的多值依赖称为平凡的多值依赖。

    2、如果 X→→Y,并且Z=U-X-Y ≠ ∅。这样的多值依赖称为非平凡的多值依赖。

    3、如果X→Y,则肯定有X→→Y。(有函数依赖必然有多值依赖)

    4、如果Y ⊂ X,则肯定有X→→Y。(平凡的函数依赖必然是多值依赖)**

    • 因为Y ⊂ X,则X→Y,所以X→→Y,即平凡的函数依赖必然是多值依赖,但多值依赖不一定是函数依赖。

    注意:当Z = U -X-Y = ∅ 或者Y ⊂ X时,肯定有X→→Y,对于这样的多值依赖我们一般不讨论。

    多值依赖与函数依赖的区别

    • 多值依赖的有效性与属性集的范围有关。

      • 若X→→Y在U上成立, 则在W(X∪Y ⊆ W ⊆ U)上一定成立。
      • X→→Y在W(W ⊂ U)上成立,在U上并不一定成立。
    • 函数依赖有效性与属性集的范围无关。

    • 若函数依赖X→Y在R(U)上成立, 则对于任何Y ´⊂ Y均有X→Y´成立。

    • 多值依赖X→→Y若在R(U)上成立, 我们却不能断言对于任何 Y´⊂ Y 有X→→Y´成立。

    4NF

    4NF的定义:关系模式R(U, F) ∈ 1NF,如果对R的每一个多值依赖X →→ Y(U-X-Y ≠ ∅ 且Y ⊈ X),X都含有码,则称R ∈ 4NF。

    4NF:对于每个非平凡的多值依赖必是函数依赖

    由第四范式可得知如下结论:

    1、结论1:如果一个关系模式R ∈ 4NF,则必有R ∈ BCNF。

    2、结论2:如果一个关系模式R ∈ 4NF, 对于每个多值依赖X →→ Y (U-X-Y ≠ ∅ 且 Y ⊈ X),则必有函数依赖X → Y 。

    注意:只有消除不是函数依赖的多值依赖X→→Y(U-X-Y ≠ ∅且Y ⊈ X) ,一个关系模式才可以∈4NF。

    e.g:关系模式

    • C(Cno,Cn); T(Tno, Tn); B(Bno, Bn)
    • CTB(Cno, Tno, Bno)

    关系模式CTB(Cno, Tno, Bno)的候选码:全码

    • CTB(Cno, Tno, Bno)属于BCNF yes
    • CTB(Cno, Tno, Bno)是否 ∈ 4NF no
    • Cno→→Tno(U-Cno-Tno≠ ∅且Tno ⊈ Cno)
      这时Cno↛ Tno
    • Cno→→Bno(U-Cno-Tno≠ ∅且Tno ⊈ Cno)
      这时Cno↛ Bno

    对关系模式CTB(Cno, Tno, Bno)进行分解

    • CT(Cno,Tno)
    • CB(Cno,Bno)

    对于CT(Cno,Tno)

    • 全码
    • ∈ 4NF

    对于CB(Cno,Bno)

    • 全码
    • ∈ 4NF

    规范化

    • 函数依赖和多值依赖是两种最重要的数据依赖。

      • 如果只考虑函数依赖,则属于BCNF的关系模式规范化程度已经最高了。
      • 如果考虑多值依赖,则属于4NF的关系模式规范化程度是最高的了。
    • 关系模式的规范化过程是通过对关系模式的分解来实现的。模式的分解就是把低一级的关系模式分解为若干个高一级的关系模式。

      • 这种分解不是唯一的。

    规范化的基本思想:

    • 通过对关系模式的分解消除不合适的数据依赖(函数依赖和多值依赖)。
    • 可以采用合理的设计方法,使关系关系模式在设计时式达到某种程度的“分离”,以消除不合适的数据依赖。
      • 采用“一事一地”的模式设计原则
      • 让一个关系描述一个实体或者实体间的一种联系
    • 所谓规范化实质上是概念的单一化

    6.3、数据依赖的公理系统

    主要是讲函数依赖的公理系统

    6.3.1、逻辑蕴含

    逻辑蕴含的定义:对于满足一组函数依赖F的关系模式R<U,F>,其任何一个关系r,若函数依赖X→Y都成立, 则称F逻辑蕴含X→Y

    例如:

    在R<U, F>中,其中U={A, B, C}, F={A→B,B→C} 。
    A→C:被F逻辑蕴含
    A→BC:被F逻辑蕴含
    A→A:被F逻辑蕴含(平凡的函数依赖)
    A→B:被F逻辑蕴含
    B →A:不被F逻辑蕴含
    

    6.3.2、Armstrong公理系统

    • 一套推理规则,是模式分解算法的理论基础
    • 用途
      • 求得F所逻辑蕴含的函数依赖

    对于关系模式R<U,F>来说有以下的推理规则:

    • A1、自反律(Reflexivity):若Y ⊆ X ⊆U,则X→Y为F所蕴含。
    • A2、增广律(Augmentation):若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含。
    • A3、传递律(Transitivity):若X→Y及Y→Z为F所蕴含,则X→Z为F所蕴含。

    Armstrong公理系统的有效性与完备性

    • 有效性:由F出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中。
    • 完备性:F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来。

    自反律、增广律、传递律的证明

    1、自反律:若Y ⊆ X ⊆U,则X→Y为F所蕴含。

    • 证:对于R <U,F> 的任一关系r中的任意两个元组t、s,若t[X]=s[X],
      由于Y⊆X,有t[Y]=s[Y],
      所以X→Y成立,自反律得证。

    2、增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含。

    • 证:
      对于R<U,F>的任一关系r中任意的两个元组t、s,若t[XZ]=s[XZ],
      则有t[X]=s[X] 和 t[Z]=s[Z];
      由于X→Y,于是有t[Y]=s[Y],
      所以t[YZ]=s[YZ],
      所以XZ→YZ为F所蕴含,增广律得证。

    3、传递律:若X→Y及Y→Z为F所蕴含,则 X→Z为 F所蕴含。

    • 证:
      对于R<U,F> 的任一关系 r中的任意两个元组 t、s,若t[X]=s[X],
      由于X→Y成立,有 t[Y]=s[Y];
      再由Y→Z成立,有t[Z]=s[Z],
      所以X→Z为F所蕴含,传递律得证。

    根据Armstrong公理系统的A1,A2,A3这三条推理规则,可以得到下面三条比较有用的推理规则

    • 合并规则:由X→Y,X→Z,有X→YZ。
      ∵ X→Y ∴ X→XY (A2)
      ∵ X→Z ∴ XY→YZ (A2)
      ∴ X→YZ (A3)
    • 伪传递规则:由X→Y, WY→Z, 有XW→Z。
      ∵ X→Y ∴ XW→YW (A2)
      ∵ WY→Z∴ XW→Z (A3)
    • 分解规则:由X→Y及Z ⊆Y,有X→Z。
      ∵Z ⊆ Y ∴Y→Z (A1)
      又∵ X→Y ∴X→ Z (A3)

    引理6.1:X → A1 A2… Ak 成立的充分必要条件是X → Ai ( i=1,2, …, k)成立。

    • 必要性:
      X→A1A2…Ak => X→Ai ( i=1,2, …, k)
      由分解规则可以得到
    • 充分性:
      X→Ai ( i=1,2, …, k) => X → A1 A2… Ak
      由合并规则可以得到

    F^+^(函数依赖集)的闭包

    F+的定义:在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作F的闭包,记为F^+^。

    例1:
    在这里插入图片描述

    例2:
    在这里插入图片描述

    • F^+^ 计算是NP完全问题。

    F^+^是函数依赖的集合,而X+~F~是X关于F属性集的集合

    属性集X关于函数依赖集F的闭包(X+~F~)

    • 为U上一组函数依赖,X ⊆ U,X+~F~={A|X → A能由F根据Armstrong公理推出},称为属性集X关于函数依赖集F的闭包。A是U中的单个属性。

    例1:
    在这里插入图片描述

    F^+^与X^+^ ~F~的区别

    • F+是函数依赖的集合,该集合里的每个函数依赖都被F逻辑蕴涵
    • X^+^F为属性的集合,对于该集合里的每一个属性A,X → A能由F根据Armstrong公理推出

    引理6.2:设F为属性集U上的一组函数依赖, X, Y ⊆ U, X→Y能由F根据Armstrong公理导出的充分必要条件是Y ⊆ X^+^ ~F~。

    证明:
    在这里插入图片描述

    用途:将判定 X→Y 是否能由 F 根据Armstrong公理导出的问题,就转化为求出X^+^ ~F~,判定Y是否为X^+^ ~F~的子集的问题

    通过算法求 X^+^ ~F~

    求属性集X(X ⊆ U)关于U上的函数依赖集F的闭包X^+^ ~F~ 的算法思想。(迭代)

    • 基础:首先让 X^+^ ~F~ = X
    • 迭代:如果Y ⊆ X^+^ ~F~ 并且Y→ A被F逻辑蕴涵, 把A增加到X^+^ ~F~中。
    • 对于新得到X^+^ ~F~继续迭代。
    • 结束条件:前后两次迭代X^+^ ~F~保持不变或者X^+^ ~F~等于U。

    算法6.1:求属性集X(X ⊆ U)关于U上的函数依赖集F的闭包X^+^ ~F~

    • 输入:X,F ; 输出: X^+^ ~F~
    • 步骤:
      (1) 令X(0)=X,i=0
      (2) 求Z:
      Z={A | (∃V), (∃W), (V → W ∈ F ^ V ⊆ X(i) ^ A ∈ W}
      (3) X(i+1)=Z∪X(i)
      (4)判断 X(i+1) =X(i)是否成立。
      (5)如果(4)成立或X(i)=U,则X^+^ ~F~=X(i), 算法终止。
      (6)若(4)假,则让i=i+1, 返回(2) 。

    在这里插入图片描述

    练习:通过X^+^ ~F~,可以用来验证X是否关系模式R的候选码

    已知关系模式R(U, F),U={A,B,C,D,E}, F={AB→C, B→D, C→E, EC→B, AC→B}

    • 验证:(AB) 是候选码。

    • 提示:就是验证U完全函数依赖AB

    (1) U函数依赖AB

    (2) U不函数依赖AB的任一真子集

    • 如果(AB)^+^ ~F~= U可以验证(1)

    • 如果(A)^+^ ~F~ ≠ U,(B)^+^ ~F~ ≠ U可以验证(2)

    函数依赖集等价

    定义6.14:如果G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。

    引理6.3:F+=G+的充分必要条件是F ⊆ G+和G ⊆ F+

    要证明该引理要用到下面两个结论:

    1. 结论一:F和G为函数依赖集, F ⊆ G, 则有X^+^ ~F~ ⊆ ^+^ ~G~
    2. 结论二:G为函数依赖集,则G+= (G+)+

    定义6.15:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小依赖集或最小覆盖。

    1. F中任一函数依赖的右部仅含有一个属性。(右侧是单个属性)
    2. F中不存在这样的函数依赖X→A,使得F与F - {X→A}等价。(不存在多余的函数依赖)
    3. F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。(左侧不能有多余的属性)

    定理6.3:每一个函数依赖集 F 均等价于一个极小函数依赖集 F~m~。此 F~m~ 称为F的最小依赖集。

    在这里插入图片描述

    重点:如何求极小函数依赖集(也就是证明F~m~和F是等价的过程)

    证:构造性证明,依据定义分三步对F进行“极小化处理”,找出F的一个最小依赖集。

    (1)、右部 分解:

    逐一检查F中各函数依赖:X→Y,

    若Y=A1A2 …Ak,k ≥ 2

    则用{X→Aj | j=1, 2, …, k}来取代X→Y。

    (引理6.1 保证了F变换前后的等价性)

    (2)、去掉多余的依赖:

    逐一检查F' 中各函数依赖:X→A,

    令G = F' - {X→A},

    若A ∈ XG+, 则从F' 中去掉此函数依赖。

    (3)、 去掉左部多余的属性:

    逐一取出F''中各函数依赖: X→A, 设X=B1B2…Bm

    逐一考查Bi (i=l,2,…,m),

    若A ∈ (X-Bi)F''+ ,则以(X-Bi) →A 取代X →A 。

    找关系模式R中的所有候选码

    设关系模式R(U, F)

    • 若属性A仅在F的函数依赖的左部出现,则R的任一候选码必包含属性A 。

    • 若属性A在F的函数依赖中没有出现,则R的任一候选码必包含属性A 。

    • 若属性A仅在F的函数依赖的右部出现,则R的任一候选码都不包含属性A

    • 若X为仅在F的函数依赖的左部出现的属性没有在F的函数依赖中出现的属性组成的

      属性集,且X+F = U,则X为R的唯一候选码。

    在这里插入图片描述
    在这里插入图片描述

    一般做这类题的步骤:

    1、将函数依赖极小化处理

    2、找出所有的候选码

    3、判断达到第几范式

    4、进行模式分解,达到3NF

    6.4、模式的分解(未学)

  • 相关阅读:
    上传代码到github
    AFN多文件进度下载
    NSURLSession各文件关系
    H5动静分离
    iOS设备获取总结
    iOS与JS开发交互总结
    iOS11 push控制器tabbar上移问题
    解决iOS11 UIScrollView下移问题
    关于react16.4——错误边界
    关于react16.4——上下文Context
  • 原文地址:https://www.cnblogs.com/rainszj/p/12928181.html
Copyright © 2020-2023  润新知