关系代数

关系代数的应用解过程

关系代数:

  1. 确定查询目标
  2. 明确查询条件
  3. 选择查找路径, 确定操作对象
  4. 关系的合并: 据3, 联结
  5. 元组的选择: 据2, 条件
  6. 属性的指定: 据1, 投影

第八章

概述

  • 关系模式设计: 同一个关系数据库系统 有 多种不同的关系模式设计方案
  • 好的设计方案: 既有合理的数据冗余度, 又没有插入和删除操作异常
  • 不同设计结果有区别的原因: 函数依赖(属性间的语义相关性)不同
  • 关系的规范化
    • 按照给定范式要求设计关系模式
    • 范式: 对一个关系中允许存在的函数依赖的要求

      规范化理论

      函数依赖

  • 函数依赖: 一个关系中 两组属性之间的 取值约束
    • 表示: XYXY: YY函数依赖于XX
    • 直观: 在关系RR中, 每个XX的值都有唯一的一个YY值与之对应
    • 定义: 关系模式R(U)R(U)中, 关系rr中元组ririXX中的取值确定后, YY中取值必被确定, 则XYXY
    • XX决定因素, YY依赖因素
  • 发现函数依赖
    • 直接根据语义
    • 根据取值对应关系
      • 一一对应: XYXY, YXYX
      • 一多对应/多一对应: YXYX, XYXY
      • 多多对应: 没有
  • 平凡函数依赖
    • 非平凡函数依赖: XY,YXXY,YX, 默认是这个
    • 平凡函数依赖: 反之
  • 完全函数依赖
    • 完全函数依赖: XY,XX,XYXY,XX,XY, 则XfYXfY
    • 部分函数依赖: XY,XX,XYXY,XX,XY, 则XpYXpY
  • 传递函数依赖
    • XY,YX,YX,YZXY,Y⊄X,YX,YZ, 则 XZXZ为传递函数依赖
  • Armstrong公理系统
    • 基本规则
      • 自反规则: YXYX, 则XYXY
      • 增广规则: XYXY, 则XZYZXZYZ
      • 传递规则: XYYZXYYZ, 则XZXZ
    • 扩充规则
      • 分解规则: XYZXYZ, 则XYXZXYXZ
      • 合并规则: XYXZXYXZXYZXYZ
      • 伪传递规则: XYWYZXYWYZ, 则WXZWXZ
  • 函数依赖的逻辑蕴含概念
    • FF为关系模式R(U)R(U)的一个函数依赖集
    • 从已有的函数依赖出发, 利用公理系统可以推导出XYXY, 则FXYFXY
  • 函数依赖集FF的闭包F+F+: F+={XY|FXY}F+={XY|FXY}
  • 函数依赖集的等价
    • 可以互相推导出其中的函数依赖
  • 最小函数依赖集
    • FF等价的, 最小的集合
    • [解题] 寻找最小依赖集
      • 首先得到题目中的所有函数依赖, 分解成右端只有一个的依赖
      • 画箭头图, 用那堆公理尽可能减少集合大小
      • 合并依赖
  • 属性集XX在函数依赖集F+F+上的闭包X+FX+F: X+F={A|FXA}X+F={A|FXA}
    • [解题] 计算闭包
      • X+=XX+=X
      • 不断重复: 对每一个FF中的依赖YZYZ, 若YX+YX+, 则X+=X+ZX+=X+Z
      • 直到不再变化
  • 关键字
    • KU,KfUKU,KfU, 则KKRR的关键字
    • 主属性集: 所有关键字中的属性构成的集合
    • 非主属性集: 不属于任何一个关键字的属性构成的集合
    • 关键字与闭包: K+F=UK+F=U, ZF,Z+FUZF,Z+FU
    • [解题] 寻找关键字
      • 计算最小依赖集
      • 不断重复从UU中删除属性, 直到其闭包不等X于UU
      • 将得到一个关键字
      • 技巧
        • 只在左边出现过的属性 属于 每一个关键字
        • 只在右边出现过的属性 不属于 任何一个关键字
        • 只需要对两边都有的属性尝试删除即可

          与函数依赖有关的范式

  • 模式分解
    • 分解结果: 子关系模式, 满足
      • Head(R)=nHead(Ri)Head(R)=nHead(Ri)
      • Fi={XY|XYF+(XY)Head(Ri)}Fi={XY|XYF+(XY)Head(Ri)}
    • 分解方法
      • 找出所有不满足范式的依赖
      • 选择一个依赖, 设XfYXfY为这个依赖, 则将这个依赖所在的关系RR分解为
        • R1={XY,{XY}}R1={XY,{XY}}
        • R2={Head(R)Y,F2}R2={Head(R)Y,F2}
        • 其中F2={AB|ABF+(AB)Head(R2)}F2={AB|ABF+(AB)Head(R2)}
  • 1NF: 属性值不可分割, 全都满足
  • 2NF: 满足1NF, 每个非主属性都完全依赖于关键字
    • 检查:
      • 找到所有非主属性 和 所有候选关键字
      • 检查每一个非主属性AA和每一个候选关键字KK之间的函数依赖, 看看有没有部分依赖
  • 3NF: 满足2NF, 每个非主属性都不传递依赖于关键字
    • 检查: 不满足3NF, 则必然存在下列情况之一, 其中XfYXfY
      • XX是某个关键字的真子集
      • XX不是关键字
  • BCNF: 满足1NF, 若XYXYXX必含有该模式的关键字
    • 检查: 每个函数依赖, 是否满足XX是关键字
  • BCNF -> 3NF

    多值依赖与第四范式

  • 多值依赖: X→→YXY
    • 定义: 对XX的一个取值, 存在一组YY与其对应; YY的取值与UXYUXY不相关
    • 成因: 两个一对多关系CTCT, CLCL, 其合并后TTLL就是多值依赖
    • 平凡多值依赖
      • 非平凡多值依赖: UXYUXY不为空集
      • 平凡多值依赖: 反之
  • 多值依赖有关的推理规则(需要掌握)
    • 求补规则: 若XYXY, 则UXYUXY
    • 转换规则: 若XYXY, 则X→→YXY
  • 4NF
    • 定义: 若X→→YXY是非平凡多值依赖, 则XX必含有关键字
    • 特点: 函数依赖需要满足BCNF; 不是函数依赖的多值依赖只有平凡多值依赖

      模式分解的研究

  • 无损联结性
    • ρ={R1,,Rk}ρ={R1,,Rk}是对RR的一个分解
    • 如果对每个满足FF的关系实例rr都满足r=πR1(r)πRk(r)r=πR1(r)πRk(r)
    • ρρ是无损联接分解
    • 充要条件(ρ={R1,R2}ρ={R1,R2})
      • R1R2(R1R2)R1R2(R1R2)R1R2(R2R1)R1R2(R2R1)
  • 依赖保持性
    • 表示πZ(F)={XY|XYF+(XY)Z}πZ(F)={XY|XYF+(XY)Z}
    • F+=(πR1(F)πR1(F))+F+=(πR1(F)πR1(F))+

      到3NF的分解方法

  • 计算最小依赖集, 代替FF进行分解
  • S=S=
  • 对每一个函数XYXY依赖进行
    • 若在SS中找不到子关系模式ZZ, 使得XYHead(Z)XYHead(Z)
    • XXYY合并成新的子关系模式, 加入SS
  • 如果RR中的每个候选关键字KK均不在SS中, 则任选一个关键字, 其属性单独构成一个子关系模式, 加入SS