[数据库] 数据库关系分解与判断

数据库关系分解与判断

一、求最小函数依赖集

  1. 把所有的 函数依赖 中 右侧属性或属性组分解为 单属性函数依赖
  2. 对分解后的的函数依赖逐项进行删除或者保留

删除 或 保留规则

  1. 假设删除函数依赖 X → Y ,计算 X+ 中是否 包含属性 Y
  2. 若计算结果包含属性 Y ,则 函数依赖 X → Y 删除
  3. 若计算结果不包含属性 Y ,则 函数依赖 X → Y 保留
  4. 以此类推 计算所有的函数依赖结果
  1. 将删除或保留后的函数依赖左边最小化,针对左部分属性数量两个以上(含两个)

规则 以左部两个属性为例(XW→ Y)

  1. 假设删除 属性W 通过 2 计算函数依赖结果计算 X+ 是否包含Y
  2. 若包含Y 则删除属性W
  3. 若不包含Y 则保留属性W
  4. 假设删除属性X 通过 2 计算函数以来结果计算 W+ 是否包含Y
  5. 若包含Y 则删除属性X
  6. 若不包含Y 则保留属性X
  7. 保留最小的删除结果
  1. 所保留的所有依赖为最小依赖集Fmin

二、候选键

  1. 根据函数依赖 选出四最属性(L, R, LR, N)

形如 : 左侧 → \rightarrow 右侧

L : 属性只出现在左侧

R : 属性只出现在右侧

LR: 属性出现在左右两侧

N : 属性未出现在函数依赖中

  1. 令 X = L ∪ \cup N ,计算 X+ 判断 是否为 U
    1. 是则为候选键,否则不为候选键
  2. 从LN中选取一个属性 Y
    1. 求 (XY)+ 是否为 U
    2. 是则为候选键,否则不为候选键
  3. 从LN 中选择 2个(除了3中已经满足候选键的属性)属性 WZ
    1. 求(XWZ)+ 是否为 U
    2. 是则为候选键,否则不为候选键
  4. 选取三个… 重复,指导无法满足条件
  5. 结束

三、判断保持函数依赖

  1. 计算所有函数依赖中 X → \rightarrow Y, 左部分X+
  2. 根据分解后的关系 计算 π R i ( F ) \pi_{R _i}(F) πRiF 的函数依赖Fi 求函数依赖在关系模式上的投影
  3. 判断F 是否是 求得所有Fi 并集的子集 记:FU
  4. 若是,则保持函数依赖,结束,否则执行5
  5. 将F中不在FU 中的函数依赖 左部分 根据 FU 计算闭包 是否包含右部分
  6. 若包含则保持函数依赖,否则不保持函数依赖

四、范式与范式分解

1NF 2NF 3NF BCNF 4NF 数据无法再分解 消除非主属性对码部分依赖 消除非主属性对码传递依赖 消除主属性对码的部分与传递依赖 消除非平凡函数且非函数依赖的多值依赖 1NF 2NF 3NF BCNF 4NF

4.1、将关系模式分解为2NF

基本方法

👽 设关系模式R(U) 主键W

: 若出现中文叙述表示属性,可以设字母表示某种属性

例如: 学生(学号,姓名,性别,年龄,入学年份,学院)

可转化为: 设S:学生,A:学号,B:姓名,C:性别,D:年龄,E:入学年份,F:学院

S(A,B,C,D,E,F)

  1. R上存在函数依赖FD:X → \rightarrow Y,其中Y为非 主属性,X ⊂ \subset W(W → \rightarrow Y是一个部分FD),

  2. 将R分解为

    • R1 (X,Y): 主键X,FD:F1(X → \rightarrow Y)

    • R2 ({U-Y}):主键为W,FD:F2()

    • 计算R2 中所有的函数依赖

  3. 判断R2 是否满足 2NF

    • 若为 2NF,则分解结束

    • 若不满足,则继续执行1️⃣

  4. 分解结果:P(R1,R2,R3,…)

例题

R(A,B,C,D),F={AB → \rightarrow CD,A → \rightarrow D},主属性AB,非主属性CD

(根据关系分解为更高范式时,必满足低范式)

  1. 分解R中第一个非主属性部分函数依赖

    • R1(AD),F1={A → \rightarrow D},R2(A,B,C),F2={}
  2. 计算R2中的函数依赖 (根据R2 与 F中的函数依赖)

    • A+ = AD,B+ = B,C+ = C,(AB)+ = ABCD,(AC)+ = ACD,(BC)+ = BC …
  3. 删除R2 中没有的属性和闭包只有本身的

    • (AB)+ = C,

    • 结果F2={AB → \rightarrow C}

  4. R1 满足BCNF,R2 满足BCNF,即满足2NF,分解后的关系P(AD,ABC)

4.2、将关系模式分解为3NF

课本分解方法

课本定义

数据库系统教程

将关系模式R无损分解且保持函数依赖分解成3NF

对关系模式R上和R上成立的函数依赖集F

  1. 先求出F的最小依赖集Fmin,然后再把F min 集中左部分相同的FD合并到一起
  2. 对Fmin中每个函数依赖 X → \rightarrow Y,构造一个模式XY
  3. 在构造的模式中,如果每个模式都不包含R的候选键,那么把候选键作为一个模式放入模式集中(多个候选键放一个就可)

例题

例题

  1. 求出F的最小依赖集Fmin,结果F={A → \rightarrow B,A → \rightarrow E,A → \rightarrow G,CDE → \rightarrow G,G → \rightarrow C,G → \rightarrow D }
  2. 合并函数依赖:F={A → \rightarrow BEG,CDE → \rightarrow G,G → \rightarrow CD }
  3. 分解模式:R1(ABEG),R2(CDEG),R3(GCD)
  4. 根据分解的模式求候选键,R1(ABEG),R2(CDEG),R3(GCD)。注: R3 是R2 的子集,所以可直接舍去R3

4.3、将关系模式分解为BCNF

算法(看例题)

例题

例题

  1. 计算R中键 A (唯一候选键,若不唯一从候选键集中选一个)
  2. 找出F中函数依赖左侧不是候选键的函数依赖,例如C → \rightarrow D
  3. 根据找找到的函数依赖分解模式,R1(CD),F1={C → \rightarrow D };R2(ABCEF),F2={}
  4. 根据F中的函数依赖计算R1,R2的函数依赖,键并判断是否满足BCNF
    • R1(CD),F1={C → \rightarrow D },键为 C,满足BCNF;
    • F2 = {C → \rightarrow EFG,E → \rightarrow FG,A → \rightarrow BCEFG },键为 A,不满足BCNF
  5. 对R2 重复步骤1️⃣~4️⃣ 对R2 进行分解
    • R3(CEFG),F3={C → \rightarrow EFG,E → \rightarrow FG },候选键C,不满足BCNF
    • R4(ABC),F4={A → \rightarrow BC },键为A,满足BCNF
  6. 因为R3不满足BCNF,对R3 重复步骤1️⃣~4️⃣进行分解
    • R5(EFG),F3={E → \rightarrow FG },候选键E,满足BCNF
    • R6(CE),F4={C → \rightarrow E },键为C,满足BCNF
  7. 综上分解结果为: ρ \rho ρ = {CD,ABC,EFG,CE},(答案不唯一)

*4.4、将关系模式分解为4NF(不常用)

五、无损连接判断

  1. 生成n行k列的二维表,n为分解关系的R个数,K为原关系属性个数
  2. 对每个Ri 将拥有的属性标注在对应的属性列上为aj (j表示列数),无某列属性时该列标为bi,j(i为行数,j为列数)
  3. 根据根据函数依赖FD中的每个函数(X → \rightarrow Y),
    1. 找到二维表中对应属性X的属性或属性组,把 相同符号 的划分为一组,判断对应的Y
      1. 若所修改的组中含有ai,则把非ai的属性标注改为ai
      2. 若所修改的组中不含有ai,则把对应的Y属性修改为bm,j(m为修改组中行号最小的)
  4. 选择函数依赖集中的下一个函数依赖重复执行3(函数依赖按照顺序依次执行,可执行多轮)
  5. 当二维表中出现某一行符号均为a表示,或经过函数依赖再无修改的属性列,执行结束
  6. 某一行符号均为a表示:无损连接,否则为非无损连接

六、函数依赖在关系上的投影

例如

设有关系模式R = ( A , B , C , D , E , F ),R的函数依赖集F = { A → BCF , CD → E , B→D , BE → F , EF → A }

π A B C D ( F ) \pi_{ABCD}(F) πABCD(F) 函数依赖在关系模式R1(A,B,C,D )上的投影

  1. 求R1 中每个单属性在F上的闭包
    • A+ = ABCFDE , B+ = BD , C+ = C , D+ = D,A+ 包含所有属性,即A是一个候选码
  2. 求R1中两个属性组合在F上的闭包,由于A已经候选码,剩余选择属性中不包含A
    • (BC)+ =BCDEFA,(BD)+=BD,(CD)+ = CDE,(BC)+ 所有属性,即BC是一个候选码
  3. 求R1中三个属性组合在F上的闭包,由于BC已经作为候选码,剩余属性不包含BC
    • 由于剩余属性中只有D,不满足三个属性,算法结束
    • 若满足三个属性条件,继续执行组合计算闭包循环
  4. 找出右侧与ABCD有关的函数依赖,去除R1中不包含的属性:1️⃣A → \to BCD ,2️⃣B → \to D,3️⃣BC → \to DA
  5. 检查函数依赖(是否包含部分函数依赖)
    • 3️⃣ 可分解为 :BC → \to D,BC → \to A,由于2️⃣,BC → \to D 是部分函数依赖,(舍去))
  6. 输出F1 = { A → BCD , B → D , BC → A }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星如雨l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值