关系模式及范式

关系模式及第一范式(1NF)

  • 关系模式由五部分组成,是一个五元组:R(U, D, DOM, F)
    • 关系名R是符号化的元组语义
    • U为一组属性
    • D为属性组U中的属性所来自的域
    • DOM为属性到域的映射
    • F为属性组U上的一组数据依赖
  • 由于D、DOM与模式设计关系不大,因此可以把关系模式看作一个三元组:R
    • 当且仅当U上的一个关系r满足F时,r称为关系模式R的一个关系
    • 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)

数据依赖

  • 数据依赖
    • 是一个关系内部属性与属性之间的一种约束关系
      • 通过属性间值的相等与否体现出来的数据间相关联系
    • 是现实世界属性间相互联系的抽象
    • 是数据内在的性质
    • 是语义的体现
  • 数据依赖的主要类型
    • 函数依赖(Functional Dependency,简记为FD)
    • 多值依赖(Multi-Valued Dependency,简记为MVD)

函数依赖

  • 函数依赖普遍存在于现实生活中
    • 描述一个学生关系,可以有学号、姓名、系名等属性。
      • 一个学号只对应一个学生,一个学生只在一个系中学习
      • “学号”值确定后,学生的姓名及所在系的值就被唯一确定。
      • Sname=f(Sno),Sdept=f(Sno)
        • 即Sno函数决定Sname,Sno函数决定Sdept
        • 记作Sno→Sname,Sno→Sdept

1NF的问题

  • 关系模式Student中存在的问题:
    • 数据冗余
      • 浪费大量的存储空间
        • 每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
    • 修改复杂,更新异常(Update Anomalies)
      • 数据冗余 ,更新数据时,维护数据完整性代价大。
        • 某系更换系主任后,必须修改与该系学生有关的每一个元组。
    • 插入异常(Insertion Anomalies)
      • 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
    • 删除异常(Deletion Anomalies)
      • 如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了
  • 结论
    • Student关系模式不是一个好的模式。
    • 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
  • 原因
    • 由存在于模式中的某些数据依赖引起的。
  • 解决方法
    • 用规范化理论改造关系模式来消除其中不合适的数据依赖
  • 把这个单一的模式分成三个关系模式:
    • S(Sno,Sdept,Sno → Sdept);
    • SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
    • DEPT(Sdept,Mname,Sdept → Mname);
  • 这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制

范式

  • 范式是符合某一种级别的关系模式的集合。
  • 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
  • 范式的种类:
    • 第一范式(1NF)
    • 第二范式(2NF)
    • 第三范式(3NF)
    • BC范式(BCNF)
    • 第四范式(4NF)
    • 第五范式(5NF)
  • 各种范式之间存在联系
    • 某一关系模式R为第n范式,可简记为R∈nNF
    • 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)

函数依赖与码

函数依赖

  • 定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y,X称为这个函数依赖的决定因素(Determinant)
  • 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
  • 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
    • 例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
  • 数据库设计者可以对现实世界作强制的规定。
    • 例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝插入该元组。

平凡函数依赖与非平凡函数依赖

  • 在关系模式R(U)中,对于U的子集X和Y,
    • X→Y,但Y ⊈ X,则称X→Y是非平凡的函数依赖
    • X→Y,但Y $\subseteq$ X, 则称X→Y是平凡的函数依赖
  • 对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。因此若不特别声明, 我们总是讨论非平凡函数依赖

完全函数依赖与部分函数依赖

传递函数依赖

  • 主属性与非主属性
    • 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
    • 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
  • 全码:整个属性组是码,称为全码(All-key)

外码

  • 关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称 X是R 的外部码(Foreign key)也称外码。
    • SC(Sno,Cno,Grade)中,Sno不是码,Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
  • 主码与外部码一起提供了表示关系间联系的手段

1NF,2NF,3NF

1NF

  • 如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
  • 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
  • 但是满足第一范式的关系模式并不一定是一个好的关系模式。

2NF

  • 一个关系模式不属于2NF,会产生以下问题:
    • 数据冗余
    • 修改复杂,更新异常
      • 如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化
    • 插入异常
      • 如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
    • 删除异常
      • 如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了
  • 出现这种问题的原因
    • 例子中有两类非主属性:
      • 一类如Grade,它对码完全函数依赖
      • 另一类如Sdept、Sloc,它们对码不是完全函数依赖
  • 解决方法:
    • 用投影分解把关系模式S-L-C分解成两个关系模式
      • SC(Sno,Cno,Grade)
      • S-L(Sno,Sdept,Sloc)
  • 问题(以学生为例)
    • 数据冗余
      • 有改进
    • 修改复杂,更新异常
      • 有改进,如,修改学生院系,只需修改SL表格
    • 插入异常
      • 仍然存在
    • 删除异常
      • 仍然存在

3NF


  • 问题(以学生为例)
    • 数据冗余
      • 有改进
    • 修改复杂,更新异常
    • 插入异常
      • 有改进
    • 删除异常
      • 有改进

BCNF

3NF的问题

  • 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
  • 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。
  • 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。

BCNF

  • BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式

  • BCNF的关系模式所具有的性质
    • 所有非主属性都完全函数依赖于每个候选码
    • 所有主属性都完全函数依赖于每个不包含它的候选码
    • 没有任何属性完全函数依赖于非码的任何一组属性
  • 如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常。




  • 非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
  • 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
  • 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常。
  • 3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。

多值依赖与4NF

多值依赖

  • 例[6.9]设学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用
    • 用关系模式Teaching(C,T,B)来表示课程C、教师T和参考书B之间的关系。
    • Teaching具有唯一候选码(C,T,B), 即全码。
    • Teaching∈BCNF





多值依赖的性质

  • 多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y
    • 多值依赖的对称性可以用完全二分图直观地表示出来。
    • 从[例6.10] 容易看出,因为每个保管员保管所有商品,同时每种商品被所有保管员保管,显然若W→→S,必然有W→→C。
  • 多值依赖具有传递性。即若X→→Y,Y→→Z, 则 X→→Z -Y。
  • 函数依赖是多值依赖的特殊情况。即若X→Y,则 X→→Y。
  • 若X→→Y,X→→Z,则X→→YZ。
  • 若X→→Y,X→→Z,则X→→Y∩Z。
  • 若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y。

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

  • 多值依赖的有效性与属性集的范围有关
    • 若X→→Y在U上成立,则在W(XYÍ W Í U)上一定成立;反之则不然,即X→→Y在W(W Ì U)上成立,在U上并不一定成立。
    • 原因:多值依赖的定义中不仅涉及属性组X和Y,而且涉及U中其余属性Z。
    • 一般地,在R(U)上若有X→→Y在W(W $\subset$ U)上成立,则称X→→Y为R(U)的嵌入型多值依赖。
  • 函数依赖X→Y的有效性仅决定于X、Y这两个属性集的值
    • 只要在R(U)的任何一个关系r中,元组在X和Y上的值满足定义6.1,则函数依赖X→Y在任何属性集W(XY$\subseteq$ W $\subseteq$U)上成立。
  • 若函数依赖X→Y在R (U)上成立,则对于任何Y‘ $\subset$ Y均有X→Y’ 成立。多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’ $\subset$ Y有X→→Y’ 成立。
  • 例如,关系R(A,B,C,D),A→→BC成立,当然也有A→→D成立。有R的一个关系实例,在此实例上A→→B是不成立的。

4NF