Skip to content
难度基础(★)
建议时长45分钟

3.6.1 规范化理论概述

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

为什么规范化是数据库章节的难点

规范化理论是关系数据库设计中最抽象的一段。字幕里特别提醒:它在上午题中基本必考,下午题也会间接出现;难点不在背名词,而在把“函数依赖、候选键、主属性、范式、模式分解”串成一个判断流程。

规范化研究的是关系模式是否设计合理。一个表如果把多个主题混在一起,会产生数据冗余和操作异常。例如把学生、课程、教师、成绩都塞进一张表:

学号姓名课程号课程名任课教师成绩
S01张三C01数据库王老师90
S02李四C01数据库王老师86

这里“C01 是数据库、任课教师王老师”被重复存储。若课程名修改,需要改多行;若最后一名选课学生删除,课程信息也可能随之丢失;若还没人选课,就无法单独插入课程。这就是规范化要解决的问题。

规范化要消除的异常

异常发生原因例子
插入异常某些事实必须依赖另一类事实才能插入没有学生选课时无法记录课程信息
删除异常删除某类事实时误删另一类事实删除最后一条选课记录导致课程信息消失
修改异常同一事实重复存储,修改要改多处课程名改名时要更新所有选课行
数据冗余不同主题混在同一关系中课程名、教师名反复出现

规范化不是为了把表拆得越碎越好,而是为了让每个关系模式表达清楚的主题,减少由函数依赖造成的冗余。

整个规范化板块的路线图

字幕把本板块分成三层:基本概念、范式判断、模式分解。

mermaid
flowchart LR
  A["函数依赖"] --> B["候选键"]
  B --> C["主属性 / 非主属性"]
  C --> D["判断 1NF、2NF、3NF、BCNF"]
  D --> E["通过模式分解提高范式"]
  E --> F["检查无损连接与保持依赖"]
层次要解决的问题常用工具
基本概念谁决定谁,哪些属性能唯一标识元组函数依赖、属性闭包、候选键
范式判断当前关系模式规范到什么程度1NF、2NF、3NF、BCNF
模式分解如何把低范式模式拆成更合理的模式无损连接、保持函数依赖

规范化属于逻辑结构设计

考试很喜欢问规范化属于数据库设计的哪个阶段。答案是逻辑结构设计阶段。原因是规范化针对的是关系模式:

E-R 图关系模式范式检查与分解

它不关心某张表具体存在哪个数据文件,也不直接决定索引怎么建;这些是物理设计问题。规范化关心的是“关系模式中的属性是否放在合适的位置”。

范式提高的代价

范式越高,通常冗余越少,更新异常越少;但它也可能带来更多连接操作。工程上并不是无脑追求最高范式,而是在一致性、性能和查询复杂度之间取平衡。

设计状态优势代价
低范式/未充分规范化查询时可能少连接冗余大,插删改异常明显
较高范式数据事实分离,更新一致性好查询可能需要更多连接
有控制的反规范化面向高频查询优化性能需要额外机制保证冗余一致

软考题通常站在理论设计角度,要求用规范化减少冗余;实际系统中是否反规范化,是在理解规范化之后的性能权衡。

做题路线

  1. 先列出题干给定的函数依赖,不要直接猜范式。
  2. 求候选键,再据此区分主属性和非主属性。
  3. 检查是否存在非主属性对候选键的部分依赖,决定是否满足 2NF。
  4. 检查是否存在非主属性对候选键的传递依赖,决定是否满足 3NF。
  5. 检查每个非平凡函数依赖的决定因素是否都是候选键,决定是否满足 BCNF。
  6. 如果要求分解,再判断是否无损连接、是否保持函数依赖。

例题

单选
规范化理论的主要目标是:
单选
判断范式前通常应先求:

自查要点

  1. 规范化解决哪些设计问题?
  2. 为什么函数依赖是范式判断基础?
  3. 范式题为什么要先求候选键?