数据库规范化过程详解(含具体计算步骤)

数据库规范化过程详解(含具体计算步骤)


一、规范化过程数学基础

1. 核心概念定义

  • 函数依赖(FD):X → Y 表示X决定Y,即对于X的每个值,Y有且只有一个值对应
  • 闭包(X⁺):给定FD集合F,X⁺表示能从F推导出的所有被X决定的属性集
  • 候选键:最小的属性集K,满足K⁺ = R(所有属性)

2. 计算工具

  • Armstrong公理
    • 自反律:若Y⊆X,则X→Y
    • 增广律:若X→Y,则XZ→YZ
    • 传递律:若X→Y且Y→Z,则X→Z

二、完整规范化计算实例

初始表结构

R(A,B,C,D,E,F)
FD集合F = {A→BC, B→D, CD→E, E→F}

步骤1:计算候选键

  1. 计算各属性在FD中的出现情况:

    • 左侧:A,B,CD,E
    • 右侧:B,C,D,E,F
    • 未出现在右侧的属性:A
  2. 计算A的闭包A⁺:

    • A⁺ = A (初始)
    • A→BC ⇒ A⁺ = ABC
    • B→D ⇒ A⁺ = ABCD
    • CD→E ⇒ A⁺ = ABCDE
    • E→F ⇒ A⁺ = ABCDEF = R
      ∴ A是候选键
  3. 检查是否有其他候选键:

    • 尝试组合:如B、C、D等的闭包都无法决定所有属性
    • 唯一候选键:A

步骤2:检查2NF(消除部分依赖)

  1. 当前FD:

    • A→BC (完全依赖)
    • B→D (部分依赖,因为B是A的真子集)
    • CD→E
    • E→F
  2. 分解过程:

    • 将部分依赖B→D分离:
      R1(A,B,C,E,F)
      R2(B,D)
    • 更新FD:
      F1 = {A→BC, CD→E, E→F}
      F2 = {B→D}
  3. 验证:

    • R2已满足2NF
    • R1中:
      • A→BC (完全)
      • CD→E (需要检查)

步骤3:检查3NF(消除传递依赖)

  1. 分析R1(A,B,C,E,F):

    • 候选键仍为A
    • 计算传递依赖:
      A→BC → CD→E → E→F
      即存在A→E→F的传递链
  2. 分解过程:

    • 将E→F分离:
      R11(A,B,C,E)
      R12(E,F)
    • 更新FD:
      F11 = {A→BC, CD→E}
      F12 = {E→F}
  3. 检查R11:

    • 新候选键:A
    • CD→E中,CD不是超键,存在非主属性对非候选键的依赖

步骤4:分解到BCNF

  1. 处理R11(A,B,C,E):

    • 违反BCNF的FD:CD→E(CD不是超键)
    • 分解:
      R111(C,D,E)
      R112(A,B,C)
    • 更新FD:
      F111 = {CD→E}
      F112 = {A→BC}
  2. 最终分解结果:

    • R2(B,D)
    • R111(C,D,E)
    • R112(A,B,C)
    • R12(E,F)

步骤5:验证无损连接

使用Chase算法验证:

构造初始表(a,b,c,d,e,f表示原属性值):

A B C D E F
R2 b1 d1
R111 c2 d2 e2
R112 a3 b3 c3
R12 e4 f4

应用FD:

  1. A→BC:使R112的b3=b1,c3=c2
  2. B→D:使d1=d2
  3. CD→E:使e2=e4
  4. E→F:使f4=f1

最终可以得到一行全a-f的值,证明是无损分解。

步骤6:验证依赖保持

检查原FD是否被保持:

  • A→BC:在R112中
  • B→D:在R2中
  • CD→E:在R111中
  • E→F:在R12中
    所有FD都被保持

三、实际应用案例计算

案例:图书馆管理系统

初始表:借阅记录(借书证号,姓名,电话,图书ISBN,书名,作者,出版社,借出日期,应还日期)

1. 确定FD

{
借书证号 → 姓名,电话
ISBN → 书名,作者,出版社
借书证号,ISBN,借出日期 → 应还日期
}

2. 计算候选键
  • 计算{借书证号,ISBN,借出日期}⁺:
    • 初始:借书证号,ISBN,借出日期
    • 借书证号→姓名,电话 ⇒ +姓名,电话
    • ISBN→书名,作者,出版社 ⇒ +书名,作者,出版社
    • 最后一个FD直接得到应还日期
      ∴ {借书证号,ISBN,借出日期}是候选键
3. 分解到2NF
  • 部分依赖:
    借书证号→姓名,电话
    ISBN→书名,作者,出版社
  • 分解结果:
    读者(借书证号,姓名,电话)
    图书(ISBN,书名,作者,出版社)
    借阅记录(借书证号,ISBN,借出日期,应还日期)
4. 检查3NF

各表已无传递依赖,满足3NF

5. 检查BCNF
  • 读者表:借书证号→姓名,电话(决定因素是候选键)
  • 图书表:ISBN→书名,作者,出版社(决定因素是候选键)
  • 借阅记录:{借书证号,ISBN,借出日期}→应还日期(决定因素是候选键)
    已满足BCNF

四、关键计算要点总结

  1. 候选键计算步骤

    • 找出所有不在FD右侧的属性
    • 计算这些属性的闭包
    • 若不能决定所有属性,逐步添加其他属性
  2. 范式检查流程

    1NF:原子性检查
    2NF:消除部分依赖
    3NF:消除传递依赖
    BCNF:决定因素都是候选键
    4NF:消除多值依赖
  3. 无损连接验证算法

    • 为每个分解后的关系创建一行
    • 用字母标记存在的属性,空白表示不存在
    • 应用FD尝试推导出全字母行
  4. 依赖保持检查

    • 对每个原FD X→Y,检查Y⊆X⁺(在分解后的FD集合下计算闭包)

通过这种系统化的计算过程,可以确保数据库设计既满足规范化要求,又保持数据的完整性和查询效率。实际应用中建议配合数据库设计工具进行自动化验证。

你可能感兴趣的:(数据库,数据库)