函数依赖与范式分解

kp-007 · 关系理论与范式核心约 30 分钟已校对

前置知识点

前置:

相关知识点

相关:

学习进度:

一句话定义

函数依赖(Functional Dependency,X → Y)刻画「X 相同则 Y 必相同」的数据约束,范式(Normal Form)则依据依赖关系把大表无损分解为小表,以消除插入、更新、删除三类异常。

为什么重要

前置知识

kp-006(关系模式、候选键、设计流程)。

核心概念

原理与机制

三类异常同源于冗余:设表 orders(order_id, user_name, user_city) 存在 order_id → user_id → user_name, user_city。更新异常:同一用户改名需改多行;插入异常:新用户没有订单就进不了表;删除异常:删掉某用户全部订单,其信息随之消失。分解方法:先求候选键(从「只出现在依赖右部」的属性开始判断闭包),再对每个违反 BCNF 的非平凡依赖 X → Y,把模式拆成 (X ∪ Y) 与 (R − Y),重复直至全部满足。3NF 与 BCNF 的差异:3NF 允许「右部是主属性」的依赖存在,因此 3NF 总能同时做到无损与依赖保持,而 BCNF 只保证无损、可能丢依赖——这是考试与工程里都必须讲清的经典取舍。

实例或案例

对 R(student, course, teacher, teacher_office),依赖 teacher → teacher_office、(student, course) → teacher。候选键为 (student, course)。teacher_office 非主属性,通过 teacher 传递依赖候选键,违反 3NF。分解:R1(teacher, teacher_office)、R2(student, course, teacher),两表均为 BCNF,连接键 teacher 无损还原,且每个依赖都能落在单表内检验(依赖保持)。

常见误区

自测题

  1. 如何验证 X 是否为超键? 答:计算属性闭包 X⁺,若 X⁺ 包含 R 的全部属性则 X 是超键;若 X 的任何真子集闭包都不全,则 X 是候选键。
  2. 3NF 与 BCNF 的核心差别? 答:3NF 允许「决定方不是超键但右部是主属性」的依赖,从而总能无损且依赖保持地分解;BCNF 更严格、可能失去依赖保持。

公式或模型

闭包算法(多项式时间):令 S = X;反复扫描依赖集 F,若存在 A → B 且 A ⊆ S,则 S = S ∪ B,直到 S 不再增大;S 即 X⁺。判超键:X⁺ = R。判 BCNF:对每个非平凡 X → A,验证 X⁺ 是否等于 R。

图示

本节不适用:依赖关系用文字与算法步骤表达已足够精确,画依赖图易与 ER 图混淆。

直观类比

范式分解像整理重复登记的通讯录:原来每张借条上都抄着「张三的地址」,张三搬家后一半借条是旧地址。把「人 → 地址」抽成一本独立通讯录,借条上只留姓名——抄写错误(更新异常)从结构上消灭了。

与其他知识点的关系

kp-006 提供被检验的关系模式;kp-008 是「何时故意不分解」的工程答案;kp-024 讨论分区后跨分片的依赖与连接如何处理。

延伸阅读