范式 和模式分解
一、范式等级回顾(从低到高)
范式 | 核心要求 | 解决的问题 |
1NF | 属性不可再分(无多值属性) | 消除重复组,使表成为平坦结构 |
2NF | 在1NF基础上,消除非主属性对候选键的部分函数依赖 | 解决部分依赖导致的冗余和更新异常 |
3NF | 在2NF基础上,消除非主属性对候选键的传递函数依赖 | 解决传递依赖导致的冗余和更新异常 |
BCNF | 在3NF基础上,消除所有属性(包括主属性)对候选键的部分和传递依赖 | 解决主属性之间的依赖问题(更严格) |
📌 关键区分
2NF:只针对非主属性,且要求完全依赖(不能只依赖复合主键的一部分)。
3NF:针对非主属性,要求不能传递依赖(如学号→学院→院长)。
BCNF:针对所有属性(包括主属性),要求每个决定因子都必须是候选键。
例子速记
1NF 违反:电话字段存多个号码(如“138...,139...”)。
2NF 违反:选课表(学号,课程号,课程名)中“课程名”只依赖于课程号(部分依赖)。
3NF 违反:学生表(学号,学院,院长)中“院长”依赖于“学院”,而“学院”依赖于“学号”(传递依赖)。
BCNF 违反:教师表(教师号,课程号,系名)中,教师→系名,但系名→课程号?(不典型)更常见的是:存在候选键A→B,但B不是候选键。
二、模式分解(Decomposition)
1. 为什么要分解?
消除数据冗余、插入/更新/删除异常。
将不满足范式的关系拆分成多个满足更高范式的关系。
2. 分解的两个重要性质
性质 | 含义 | 重要性 |
无损连接性(Lossless Join) | 分解后再自然连接能还原回原关系(不丢失信息,不产生额外元组) | 必须保证 |
保持函数依赖(Preserve Dependency) | 分解后所有函数依赖仍能被各子关系的依赖集逻辑蕴含 | 最好保证,但有时为了BCNF可牺牲 |
3. 判断无损连接的方法(二维表法或公共属性闭包法)
简单法:分解为 R1 和 R2,若 R1 ∩ R2 → R1 - R2 或 R1 ∩ R2 → R2 - R1 成立,则无损。
通用法:使用表格法(Chase算法),考试中通常用上述简单法。
4. 判断保持函数依赖
将每个函数依赖的左右属性集分别检查是否全部出现在同一个分解的子关系中。若不都在同一个子关系,则可能不保持。
更严格:对每个 FD X→Y,计算 X 在分解上的投影闭包,若 Y 在其中则保持;否则不保持。