规范化
引入
词汇
| English | 释义 | 拼音 |
|---|---|---|
| insert anomaly | 插入异常 | chā rù yì cháng |
| update anomaly | 更新异常 | gēng xīn yì cháng |
| delete anomaly | 删除异常 | shān chú yì cháng |
| functional dependency | 函数依赖 | hán shù yī lài |
| second normal form | 第二范式 | dì èr fàn shì |
| third normal form | 第三范式 | dì sān fàn shì |
| Boyce-Codd | BC 范式 | BC fàn shì |
三种异常
- 非规范化的表招来三种:插入异常 insert anomaly(加不开课的课不行)、更新异常 update anomaly(一个事实改多行)、删除异常 delete anomaly(最后一行没了事实也没了)。病根是重复的事实。

{exercise:uni-cs0803-anomalies}
练习
在 14 行选课里改课程标题是——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
一个事实存多次:更新异常。
依赖驱动拆分
- 函数依赖 functional dependency $A \to B$:每个 A 值决定唯一 B 值。第二范式 second normal form 去部分键依赖;第三范式 third normal form 去传递依赖;Boyce-Codd BC 范式让每个决定因素都是键。
Enroll(student, course, title, dept, building):course → title部分键、title → dept → building传递。拆成 Course、Dept、Enroll——每个事实一次、每种异常消失。
{exercise:uni-cs0803-forms}
练习
部分键依赖违反——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
2NF 去部分键依赖;3NF 去传递依赖。
何时停手
Room(building, room, capacity, projector_type)若同楼的投影类型相同:building → projector_type是非键决定因素——拆出Building(building, projector_type)。- 存储的累计值可推导,但按视图重算可能比异常风险更贵:理解范式之后,带刷新触发器的受控反规范化是正当的。为推理而规范化;凭证据而反规范化。
{exercise:uni-cs0803-stop}
练习
非键列决定另一列违反——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
经非键决定因素的传递链即 3NF 违例。