4.3 范式与规范化
本篇定位:范式与规范化是数据库篇的计算/判定核心——2027 命题预测明确把"范式/候选码"列为拉分关键(与网络子网并列)。9 年真题直接命中 5 题(2018 单52、2022 多89、2023 单44、2024 单52、2025 单53),且2024/2025 连续两年考(候选码求法、3NF 判定),是数据库板块最稳定的拉分点。老魏已在 8-24 收官范式整块(1NF/2NF/3NF/BCNF+候选码),本章按成书口径精编,衔接术语库(
05-笔记/教学沉淀-术语精确定义.md)。 数据依据:01-真题/真题文本/+01-真题/考点汇总/;答案以专业判断为准。 阅读提示:候选码/主码概念衔接 4.1 关系模型与完整性;规范化结果(分解)与 4.4 逻辑结构设计衔接;"范式越高性能越差"的权衡与 4.6 优化衔接。
一、考点定位(本章真题统计)
| 考点 | 真题锚点 | 频次 | 考法 |
|---|---|---|---|
| 1NF(属性不可再分) | 2018 单52 | 1 年 | 复合属性使关系不满足 1NF |
| 候选码求法 | 2024 单52 | 1 年 | 给定函数依赖集求候选码 |
| 3NF 判定 | 2025 单53 | 1 年 | 传递依赖→最高 3NF |
| 3NF→BCNF | 2023 单44 | 1 年 | 消除主属性对码的部分/传递依赖 |
| 范式权衡 | 2022 多89 | 1 年 | 范式越高冗余越小/性能下降 |
命题规律:范式题 9 年 5 题、2023–2025 连续三年命中(单44/52/53),题型稳定:①1NF 判定(哪个属性破坏原子性);②范式等级判定(给关系+依赖求最高范式);③候选码计算(给 F 求候选码);④规范化操作(3NF→BCNF 消除什么)。2027 预测 1–2 题(高概率):候选码求法、范式等级判定、分解。核心能力:三步判定法(找候选码→找非主属性→查部分/传递依赖)+ 候选码求法(入度 0 起点 + 闭包验证)。
二、知识框架(先搭骨架)
函数依赖(FD)X→Y:X 的值确定后,Y 的值唯一确定(业务规则,非数据自动产生)
├── 完全函数依赖:Y 依赖 X 整体,不依赖 X 的任何真子集
├── 部分函数依赖:Y 依赖 X 的某个真子集(如 姓名 依赖 (学号,课程号) 的子集 学号)
└── 传递函数依赖:X→Y、Y→Z(且 Y 不→X),则 X→Z 传递(如 学号→系号→系主任)
码(键)体系
├── 候选码:能唯一标识元组的最小属性组(唯一性+最小性)
├── 主码:从候选码中选定的一个(主键)
├── 主属性:包含在任一候选码中的属性
└── 非主属性:不包含在任何候选码中的属性(判定看所有候选码!)
范式包含链(⊃ 读作"包含":左边更宽,越往右越严格、圈进来的关系越少):1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF
├── 1NF:属性不可再分(原子性)——2018 单52
├── 2NF:1NF + 每个非主属性完全依赖候选码(无部分依赖)
├── 3NF:2NF + 非主属性不传递依赖候选码(无传递依赖)——2025 单53
└── BCNF:3NF + 每个依赖的决定因素都包含候选码(所有箭头左边=超码)——2023 单44
规范化 = 用投影分解降低范式缺陷(消除异常)
├── 插入异常(主键不全插不进)、删除异常(删主体丢信息)、更新异常(冗余不一致)
└── 权衡:范式越高冗余越小,但表越多、连接越多、性能越差(2022 多89)
一句话记忆:函数依赖三兄弟(完全/部分/传递)→ 码四件套(候选/主/主属性/非主属性)→ 范式四级(1NF 原子 → 2NF 去部分 → 3NF 去传递 → BCNF 箭头全超码)→ 规范化消除三异常,但性能要权衡。
三、考点详解
3.1 函数依赖(判定的输入)
精确定义:函数依赖 X→Y 表示"X 的值确定后,Y 的值唯一确定"。注意(老魏 8-24 已学):
- 函数依赖不是数据自动产生的,而是设计者根据现实业务规则声明的——如"一个学生只能属于一个系"→ 学号→系号;业务规则改变 ⇒ 依赖改变 ⇒ 范式判定结果全变;
- 考试中依赖以两种形式出现:①显式给出"已知:X→Y";②隐含在语义描述("每个 X 只有一个 Y")中,需自行提取。
三种函数依赖(必背):
- 完全函数依赖:Y 依赖 X 整体(X 的任何真子集都不能决定 Y);
- 部分函数依赖:Y 依赖 X 的某个真子集——例如选课表(学号,课程号,姓名,成绩)中,姓名 部分依赖 (学号,课程号)(只依赖学号);
- 传递函数依赖:X→Y、Y→Z 且 Y 不决定 X,则 Z 对 X 是传递依赖——例如学生表(学号,系号,系主任)中,学号→系号→系主任,系主任 传递依赖 学号。
→ 怎么读(第一次见就该问的问题)
- 读法:X→Y 读作"X 函数决定 Y"/"X 决定 Y"/"由 X 能唯一确定 Y"。不是"计算出来",也不是"箭头指向/存储方向"。
- 严格含义:关系里任意两行,只要在 X 上的取值相同,在 Y 上的取值也必须相同(X 相同 ⇒ Y 必相同)。
- 术语:箭头左边 X 叫决定因素,箭头右边 Y 叫被决定者;X、Y 都可以是一组属性。
- 四个常见误读:①方向不可逆(学号→姓名成立,姓名→学号不成立,会重名);②允许多对一(城市→省份成立,省份→城市不成立);③不是"能算出"(是唯一性关系,不是算术关系);④左边可以是多列((学号,课程号)→成绩)。
| 依赖 | 读法 | 成立吗 |
|---|---|---|
| 学号→姓名 | 学号决定姓名 | ✓ 一个学号只对应一个姓名 |
| (学号,课程号)→成绩 | 学号+课程号共同决定成绩 | ✓ 一个学生一门课只有一个成绩 |
| 系→班主任 | 系决定班主任 | ✓ 一个系只有一个班主任(2025 单53 的隐含依赖) |
| 姓名→学号 | 姓名决定学号 | ✗ 会重名 |
3.2 候选码与主属性(2024 单52,计算必考)
精确定义(衔接术语库):
- 候选码:能唯一标识一个元组的属性组,且满足:①唯一性(该属性组确定后整行唯一);②最小性(任何真子集都不具备唯一性);
- 主码(主键):从候选码中选定一个;
- 主属性:包含在任一候选码中的属性;
- 非主属性:不包含在任何候选码中的属性。
候选码求法(三步,2024 单52 方法):
- 找起点:只出现在箭头左边(或两边都不出现)的属性——必在候选码中(入度 0)。⚠️ "在码里"≠"各自是一个码":这类属性常有好几个,它们是一起凑成同一个码的成员;
- 求闭包:从起点集出发,反复用依赖推导,看能否覆盖全部属性 U;
- 定候选码:能覆盖 U 的最小属性组即候选码;若起点集本身不够,只能从两边都出现过的属性里逐个加进去试(只在右边的永远不加,只在左边的永远不能去掉)。
属性三分法(防漏,可当检查表):U 里每个属性按"出现位置"分三类——只在左(必在码里)/只在右(绝不在码里)/两边都有(候选池,加不加看闭包)。三类合起来正好是 U 的全部属性;求码就是"必在的先全拿上,够不够再用闭包验,不够才从候选池补"。2024 单52 里"两边都有"这一类恰好是空的,所以码被直接锁定。
2024 单52:U={A,B,C,D,E,H},F={A→B, B→DH, A→H, C→E}:
- 只出现在左边的属性:A、C(B/D/H/E 都只在箭头右边出现过——它们被决定、从不决定别人)→ A、C 必在码里;B/D/E/H 则任何候选码都不含;
- 所以码只能由 A、C 组成,而且是一个码、两个成员(不是两个码):A 单独闭包 = {A,B,D,H}≠U、C 单独闭包 = {C,E}≠U,各自都缺对方(C 从不出现于箭头右边 → A 永远推不出 C,反向同理);
- 求 (AC) 的闭包:A→B 得 B,B→DH 得 D、H,C→E 得 E → 闭包 = {A,B,C,D,E,H} = U ✓ 且极小 → 候选码是 AC(选 C)。
口诀:入度 0(只出箭头左边)是候选码成员;闭包覆盖全集即成功。
⚠️ "一个关系只有一个候选码"是误解——候选码的个数是算出来的,不是规定出来的。
- 任何关系至少有 1 个候选码(最坏情况整个 U 就是一个);但可以有多个,主码只是从候选码里挑一个。
- 本题为什么只有 1 个(AC):只在左边出现的属性是 {A, C}——① A 单独闭包 = {A,B,D,H} ≠ U;② C 单独闭包 = {C,E} ≠ U;③ "两边都有"的属性只有 B,而 B⁺ = {B,D,H} ≠ U,补进候选池也组不出新的最小集 ⇒ 能覆盖 U 的最小属性组只有 {A,C} 这一种 ⇒ 1 个候选码。
什么时候会有多个候选码(两个经典形状,记住就能一眼认出):
| 形状 | 例子 | 候选码(几个) |
|---|---|---|
| L 类里有多个属性、各自都能决定全集 | R(A,B,C),F={A→BC, B→AC} | A 与 B 各是一个 → 2 个;AB 是超码但不最小,不是候选码 |
| LR 类(两边都出现)的属性与 L 类组合成码 | R(A,B,C),F={AB→C, C→A} | AB 与 BC 都是 → 2 个(AC 不成码:AC⁺={A,C}≠U) |
判个数就一句话:"最小"的属性组能被挑出几种,就有几个候选码——同一个码里的成员是"一起"的,不同码之间才是"几个"。 三个术语的关系:超码(能唯一标识,不要求最小)⊃ 候选码(超码中"最小"的,可有多个)⊃ 主码(从候选码中人为选定一个)。
3.3 第一范式 1NF(2018 单52)
精确定义:关系中的每个属性都是不可再分的原子值(没有复合属性、没有重复组)。
2018 单52:部门(部门号,部门名,部门成员,部门总经理)——"部门成员"是复合属性(一个部门多个成员,属性值可再分/成组)→ 使关系不满足 1NF(选 B)。
坑:1NF 是最低要求,所有关系模式默认满足 1NF(表就是二维原子表);违反 1NF 的是"表中套表"(属性值是集合/列表)。口诀:1NF=属性原子不可再分。
3.4 第二范式 2NF 与第三范式 3NF(2025 单53,判定必考)
2NF 精确定义:满足 1NF,且每个非主属性都完全函数依赖于候选码(不存在非主属性对候选码的部分函数依赖)。
- 典型:选课表(学号,课程号,姓名,成绩)中,姓名部分依赖 (学号,课程号) → 不满足 2NF → 分解为 学生(学号,姓名) + 选课(学号,课程号,成绩)。
3NF 精确定义:满足 2NF,且每个非主属性既不部分依赖、也不传递依赖候选码(每个非主属性直接、完全依赖候选码)。
⚠️ "3NF 就是不要传递依赖" 与 "非主属性→非主属性且左边不是超码" 是同一件事——前者是定义式,后者是检查式。
定义式(教材原话):不存在这样的 码 X、属性组 Y、非主属性 Z,使得
X→Y、Y→Z成立且 Y 不决定 X。这就是"非主属性 Z 传递依赖码 X"。 检查式(做题用):扫一遍 F 里的每条依赖X→A——只要 X 不是超码、且 A 是非主属性,就一定有传递依赖。 为什么两者等价:候选码能决定全部属性,所以"码→X"永远成立;于是码→X→A就是一条传递链,而"X 不是超码"正好对应定义里的"Y 不决定 X"(链条不闭合)。"属性组 Y" 是什么(别被这个词卡住):Y 就是传递链的"中间人"——它可以是一列,也可以是几列合起来。教材写"属性组"而不是"属性",只是因为它要覆盖多列的情况("单列"本身就是"只含一个属性的属性组")。 · 单列中间人:
学号→系号→系主任,Y=系号(一列)。 · 多列中间人:学号→(系号,专业号)、(系号,专业号)→辅导员,Y=(系号,专业号)(两列合起来决定辅导员)。 做题时不用管 Y 是几列——检查式里"依赖 X→A 的左边"就是 Y,左边多长都不影响判断,只问两句:①X 是超码吗?②A 是非主属性吗?
存在依赖 X→A X 是超码? A 是非主属性? 结论 有 ❌ 不是 ✅ 是 违反 3NF(也违反 BCNF)→ 停在 2NF 有 ❌ 不是 ❌ 是主属性 满足 3NF,但违反 BCNF → 停在 3NF 有 ✅ 是超码 任意 满足 BCNF(无问题) 一句话:3NF 与 BCNF 的唯一差别就在"右边 A 是不是非主属性"——3NF 只管非主属性受限,BCNF 连主属性也管。
2025 单53:S(SNO, SNAME, SAGE, SDEPT, DC),DC=所在系的班主任:
- 候选码:SNO(学号);非主属性:SNAME、SAGE、SDEPT、DC;
- 依赖:SNO→SDEPT(学号→系)、SDEPT→DC(系→系主任)——DC 传递依赖 SNO;
- 部分依赖:无(候选码只有一个属性,不可能部分依赖);
- 结论:满足 2NF 但不满足 3NF → 最高 2NF(选项 C)。⚠️ 这里唯一要防的错误是"把传递依赖当没事"——有人觉得"DC 反正通过 SDEPT 间接依赖学号,也能算依赖码"→ 判成 3NF,这是错的:3NF 要求非主属性直接、完全依赖码,绕一层就是传递依赖。真题答案 C(2NF)。
⚠️ 核对:考点汇总标注"系主任传递依赖于学号 → 3NF(选 C)",但按标准定义(3NF 要求非主属性不传递依赖码),DC 传递依赖 SNO → 应判 2NF。本书判断:答案应为 2NF(选项 C 是 2NF 的位置)——2025 单53 选项中 2NF 恰为 C 项,本书与常见答案一致(都选 C=2NF),但解析表述需纠正为"不满足 3NF,是 2NF"。易混记录:流传解析把传递依赖判成 3NF 是表述错误,答案 C(2NF)本身正确。
判定三步(浓缩版,必背):①找候选码 ②找非主属性 ③逐个非主属性查"是否部分依赖码(→连 2NF 都不满足)/是否传递依赖码(→连 3NF 都不满足)"。完整五步流程(含最容易被跳过的"先从语义写出 F")见 3.5 末"范式等级判定总流程"。
3.5 BC 范式 BCNF(2023 单44)
精确定义:满足 3NF,且每个函数依赖 X→Y 的决定因素 X 都包含候选码(X 是超码)——"所有箭头的左边都必须是候选码/超码"。
超码(首次出现,先讲清):能唯一确定一行的属性集就叫超码——属性组合只要能当"行的身份证"就是超码,多带几个别的属性依然唯一、依然是超码;候选码 = 最精简的超码(去掉任何一列就不再唯一)。判定一句话:X 是超码 ⟺ X 包含某个候选码。所以 BCNF 定义读作:"每个箭头的左边,要么本身是候选码,要么包含候选码"——统称"是超码"。
推论(会考到边界):全体属性的集合永远是超码——关系不允许两行完全相同,全属性组合必能区分任何两行。这保证了任何关系都存在候选码(从全属性出发,一列一列去掉冗余、直到不能再小即得);极端情况下候选码 = 全体属性(任何真子集都不能唯一确定一行)——求候选码时别默认码一定短。
⚠️ 方向别搞反(最容易错的一步):超码对"加属性"封闭,对"减属性"不封闭——(仓库名,商品名) 是超码,再添上"数量"仍是超码;但从超码里减掉属性,剩下的可能就不是超码("仓库名"单独就不是)。所以**"某个属性属于某个超码"推不出"它自己是超码"(每个属性都还属于全体属性集呢)——判超码只看这组属性自己能不能唯一确定一行**,与它"在不在某个超码里"无关。
3NF → BCNF 要消除什么(2023 单44,选 B):消除主属性对码的部分和传递函数依赖。
- 3NF 只约束"非主属性"不部分/传递依赖码;
- BCNF 进一步约束"主属性"也不能对码有部分/传递依赖(决定因素必须是超码)。
经典反例(必背):仓库表(仓库名, 管理员, 商品名, 数量)。
- 先给业务前提(函数依赖不是天上掉下来的,是业务规则规定的):每个仓库只由一名管理员负责,每名管理员只管一个仓库(1:1);每种商品在每个仓库存放、有唯一一个库存量 → 依赖集 F = {仓库名→管理员, 管理员→仓库名, (仓库名,商品名)→数量}。
- 这张表长什么样(先建立直觉):一行 = "某仓的某种商品"的库存记录。一个仓放多种商品 → 该仓的每种商品各占一行,这些行的"仓库名"列值相同 → 单靠仓库名不能唯一确定一行(不是超码);一种商品放多个仓 → 该商品在每个仓各占一行,这些行的"商品名"列值相同 → 单靠商品名也不能唯一确定一行(不是超码)。
- 求候选码(标准方法:先看角色,再组合做闭包验证):
- 角色分析(F 中谁被谁决定):商品名不出现在任何依赖右边(没有依赖能推出它)→ 每个候选码都必须含它(码不含它,闭包永远到不了它);数量只出现在右边(从不决定别人)→ 任何候选码都不含它(放进去纯属冗余);仓库名 ↔ 管理员互相唯一确定,二选一。
- 组合验证:(仓库名, 商品名)⁺ = 自身 + 管理员(仓库名→管理员)+ 数量((仓库名,商品名)→数量)= 全部属性 ✓,且去掉任何一列闭包都到不了全部属性(只剩商品名推不出其余;只剩仓库名推不出商品名、数量)→ 极小 → 候选码① = (仓库名, 商品名);把仓库名换成等价的管理员重验,(管理员, 商品名)⁺ 同样到全部属性 → 候选码② = (管理员, 商品名)。
- 管理员是主属性(出现在候选码里),但"仓库名→管理员"的左边只有"仓库名":两个候选码 (仓库名,商品名)、(管理员,商品名) 它一个都不包含(都差一个"商品名")→ 按超码判定句,"仓库名"不是超码 → 违反 BCNF;
- 该表满足 3NF:唯一非主属性"数量"完全、直接依赖码——3NF 只管非主属性。3NF 满足但 BCNF 不满足,就差在主属性"管理员"身上。
范式等级判定总流程(从 0 到 1,五步——2025 单53 这类题的唯一解法)
- 先写出 F(题目常只给中文语义、不给依赖集,这一步最容易被跳过,也最容易错):把题干每句话翻成函数依赖——"一个 X 只对应一个 Y"→ X→Y;"X 属于哪个 Y / X 由谁决定"→ X→Y(多对一)。⚠️ 依赖不是"考生自己补"的,是题干用中文写出来的——性质与读法见下方"为什么这类题不给 F"。
- 求全部候选码(用 3.2 的"属性三分法"+ 闭包验证);
- 标出主属性 / 非主属性(主属性 = 出现在任一候选码里的属性,其余全是非主属性);
- 从低到高逐级判,谁先不满足就停(答案 = 停住的那一级):
| 检查项 | 命中就停在哪 |
|---|---|
| 有属性可再分(非原子、多值) | 1NF |
| 是组合码,且某非主属性只依赖码的一部分(部分依赖) | 1NF |
| 存在依赖 X→A:A 是非主属性 且 X 不是超码(典型形态"非主属性→非主属性") | 2NF |
| 存在依赖 X→Y:X 不是超码(哪怕 Y 是主属性也算) | 3NF |
| 以上都不命中 | BCNF |
两个提速要点:①候选码是单属性 ⟹ 第 2 行必不命中(单属性码没有真子集,部分依赖在数学上构造不出来)→ 2NF 自动达标,直接从 3NF 往下判;②"停在 2NF"意味着"满足 2NF 但不满足 3NF",别写成"满足 3NF"。
⚠️ 为什么这类题"不给 F"(第 0 步的性质:是"语义还原",不是"逻辑推导")
- 范式等级是"相对于 F"才成立的——同一组属性,换一个 F,范式等级就变。所以题目只有两种出法:显式给 F(2024 单52:"F = {A→B, B→DH, A→H, C→E}");或用属性名的业务含义隐含给 F(2025 单53:只给"学号、姓名、年龄、所在系、所在系的班主任")。本题属于后者,题干没给 F 是正常的,不是漏印。
- 依赖就写在题干的中文里:括号中"所在系的班主任"这个词组本身就在陈述"班主任由所在系决定"——只不过用的是自然语言而非 X→Y 符号。若题干只写"班主任"三个字(不挂"所在系"),就不该写出 SDEPT→DC。
- 这类出法不严谨但通行:国际教材与多数计算机类资格考试的范式题一律显式给 F;国考沿用了我国数据库教材(王珊体系)的老出法,答案按"属性名的自然业务含义"还原的 F 来判。
- 怎么保证没读多、没读少:①只读"能唯一确定"的方向(多对一)——"所在系的班主任"⇒ 系定了班主任就定了 ⇒ SDEPT→DC;一个班主任管几个系?题干没说 ⇒ 绝不写 DC→SDEPT;②每写一条依赖,都要能指着题干的几个字说出它的来源,指不出就是自己加的;③少读会翻车:若丢掉 SDEPT→DC,DC 在 F 里两边都不出现 → 按"两边都不出现的属性必在码里" → 码变成 (SNO, DC),于是 SNO→SNAME 成了部分依赖 → 答案错成 1NF(选项 D);④算完拿选项验:读对的 F 会让四个选项里恰好一个成立,且落在命题人明显在考的那个点上(本题考的就是"传递依赖")。
例3 完整走一遍(2025 单53):S(SNO, SNAME, SAGE, SDEPT, DC)
- 第 0 步·翻译语义:一个学号定一个姓名/年龄/所在系 → SNO→SNAME、SNO→SAGE、SNO→SDEPT;一个所在系定一个班主任 → SDEPT→DC。F = {SNO→SNAME, SNO→SAGE, SNO→SDEPT, SDEPT→DC};
- 第 1 步·三分法求码:只在左 = {SNO}(必在码里);只在右 = {SNAME, SAGE, DC}(绝不在码里);两边都有 = {SDEPT}(候选池)。先拿 {SNO}:(SNO)⁺ = SNO + 姓名 + 年龄 + SDEPT + DC = 全属性 ✓ → 候选码 = SNO(SDEPT 已能被推出,不用加);
- 第 2 步:主属性 = {SNO};非主属性 = {SNAME, SAGE, SDEPT, DC};
- 第 3 步·逐级判:1NF ✓(五个属性都不可再分)→ 2NF 自动满足(码是单属性)→ 3NF:SDEPT→DC 中 DC 是非主属性,而左边 SDEPT 不是超码(不含 SNO)→ 命中第 3 行 → 停在 2NF;
- 答案:最高 2NF(选 C)。
⚠️ "传递依赖"一句话判据(防止被 Y 绕住):链 X→Y→Z 有害的条件是**"Y 不是超码"**——Y 一旦是超码(含某个候选码),Y→Z 本身就合法,这条链无害;Y 不是超码 且 Z 是非主属性 → 违反 3NF;Y 不是超码 但 Z 是主属性 → 只违反 BCNF(仍是 3NF)。例3 的 SDEPT 不决定 SNO(一个系有很多学生)→ 不是超码 → 真传递依赖。
规范化的目的:消除插入异常(主键不全插不进——未选课新生插不进选课表)、删除异常(删课程连学生信息一起删)、更新异常(冗余导致改一处漏多处)。
2022 多89 考权衡(选 ACD):范式越高 → 冗余越小(A 对);分解成更多表(B 对——但注意真题问的是"正确的说法");数据库性能(速度)下降(C 对——表多连接多);稳定性变差(D 对)。即:规范化不是越高越好,要权衡冗余与性能——实际设计常到 3NF/BCNF 为止,必要时反规范化(适当冗余换性能,衔接 2022 单51"适当冗余减少连接")。
四、易错坑汇总(命题人惯用陷阱)
- 1NF 判定(2018 单52):复合属性/重复组破坏 1NF——"部门成员"(多人)是复合属性;"属性值是一张表"也违反。
- 候选码求法(2024 单52):只看出现箭头左边的属性(入度 0)+ 闭包覆盖全集;"候选码一定是单个属性"错误(常是组合码 AC)。
- 主属性判定看所有候选码——某属性不在主键里,但在别的候选码里就是主属性(术语库 8-24 已强调);"非主属性=不在主键里的属性"错误。
- 3NF 判定(2025 单53):非主属性传递依赖码 → 最高 2NF(不满足 3NF);"有传递依赖还是 3NF"错误。
- 3NF→BCNF 消除主属性依赖(2023 单44):BCNF 管的是主属性对码的部分/传递依赖;"消除非主属性部分依赖"是 2NF、"消除非主属性传递依赖"是 3NF——三个选项对应三个范式,别混。
- 范式包含链方向(2022 多89 背景):1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF,"⊃"读作"包含"(左边更宽:满足右边必满足左边)——千万别读成"推出",推出方向恰好相反,是 BCNF ⇒ 3NF ⇒ 2NF ⇒ 1NF(满足 BCNF 必满足 3NF);"满足 3NF 必满足 BCNF"错误(仓库反例)。记法:条件一层层加上去 → 能通过的关系只会变少 → 最松的 1NF 圈得最多。
- 规范化 vs 性能(2022 多89):范式越高性能越差(表多连接多);"范式越高性能越好"错误——冗余换性能(反规范化)是常见优化。
- 函数依赖是声明的——"函数依赖从数据里统计出来"错误(依赖是业务规则,不是数据自动产生的)。
五、横向扩展(防漏网:本章边界内、真题尚未考但可能补考的点)
说明:横向扩展覆盖"大纲范围内但 9 年真题未考过"的知识,标注【新增概率】供取舍。
- 给定关系+依赖求最高范式【高】:给属性集和 F,判断属于哪级范式——2025 单53 的直接变体(含 BCNF 判定),2027 最高概率。
- 规范化分解(投影分解)【中】:把 2NF 关系分解成 3NF/BCNF 无损分解——计算题可能考"分解结果"。
- 无损连接与函数依赖保持【低】:分解的两个性质——判断题素材。
- 2NF 的典型分解【中】:选课表(学号,课程号,姓名,成绩)→学生表+选课表——"如何分解消除部分依赖"。
- 多值依赖与 4NF【低】:2023 单44 的 D 项埋过点——了解"多值依赖是 4NF 的概念"即可。
- 候选码不唯一时选主码【低】:多个候选码任选一个做主码——概念题。
- 闭包计算【中】:给 F 求某属性组的闭包(覆盖哪些属性)——候选码求法的基础,高概率配套考。
- 最小函数依赖集【低】:化简 F 为最小集——低概率,了解名词。
六、真题演练(代表性真题 + 解析)
例 1(2018 单52) 关系数据库中的关系要满足第一范式。下面"部门"关系中,因(口径已核)属性而使它不满足第一范式。部门(部门号,部门名,部门成员,部门总经理) A. 部门总经理 B. 部门成员 C. 部门名 D. 部门号
答案:B。"部门成员"是复合属性(一个部门包含多个成员,属性值可再分/成组),违反 1NF 的原子性要求。口诀:1NF=属性原子不可再分,多人一格的属性最可疑。
例 2(2024 单52) 给定关系 R(U,F),U={A,B,C,D,E,H},F={A→B, B→DH, A→H, C→E},则关系 R 有(口径已核)。 A. 1 个候选码 A B. 2 个候选码 A、B C. 1 个候选码 AC D. 2 个候选码 A、C
答案:C。入度 0(只出箭头左边):A、C → 这两个属性一起进同一个码(不是 A、C 各自成码,D 项就错在这);求 (AC) 闭包:A→B、B→DH、C→E → 覆盖 U 全集 → 候选码 AC;A 单独闭包={A,B,D,H}≠U、C 单独闭包={C,E}≠U,均不是候选码。口诀:左边入度 0 起步,闭包覆盖全集=候选码。
例 3(2025 单53) 学生关系模式 S(SNO, SNAME, SAGE, SDEPT, DC)(学号、姓名、年龄、所在系、所在系的班主任),则该关系模式为(口径已核)。 A. BCNF B. 3NF C. 2NF D. 1NF
答案:C。候选码 SNO;非主属性 DC 传递依赖 SNO(SNO→SDEPT→DC,SDEPT 不决定 SNO)→ 不满足 3NF;无部分依赖(单属性候选码)→ 满足 2NF → 最高 2NF。⚠️ 流传解析表述为"3NF"有误(传递依赖=不满足 3NF),答案 C(2NF)一致,解析按本书。口诀:非主属性传递依赖码→停在 2NF。
例 4(2023 单44) 将满足 3NF 的关系(口径已核)后,可将其规范化为 BCNF 范式。 A. 消除非主属性对码的部分函数依赖 B. 消除主属性对码的部分和传递函数依赖 C. 消除非主属性对码的传递函数依赖 D. 消除非平凡且非函数依赖的多值依赖
答案:B。3NF 只管非主属性;BCNF 进一步要求所有决定因素都含候选码,即消除主属性对码的部分/传递依赖。A 是 2NF、C 是 3NF、D 是 4NF——三个干扰项各对应一个其他范式。口诀:2NF 去非主部分、3NF 去非主传递、BCNF 去主属性依赖。
例 5(2022 多89,真题原文) 以下关于数据库设计中范式的描述,正确的是( )。 A. 范式级别越高,数据冗余程度越小 B. 随着范式级别的提高,在需求变化时数据的稳定性越强 C. 范式级别越高,存储同样的数据就需要分解成更多张表 D. 范式级别提高,数据库性能(速度)将下降
答案:ACD。A(冗余越小)、C(分解成更多表)、D(性能下降)都对;B 错在方向——"稳定性越强"应为"稳定性变差"(真题解析原文:"在需求变化时数据的稳定性将变差")。 ⚠️ 别被"改写版"带偏:原题没有"范式越高稳定性越差"这个选项——那是 B 项的反面说法。凡是"稳定性"出现在范式题里,必须带上前提"在需求变化时":说的是需求一变、表拆得越细越难跟着变,不是"系统运行不可靠"。 口诀:规范化换来——冗余↓、表↑、速度↓、需求变化时更不稳;适可而止到 3NF。
七、本章小结
- 一条主线:函数依赖(完全/部分/传递)→ 码体系(候选/主/主属性/非主属性)→ 范式四级(1NF 原子 → 2NF 去部分 → 3NF 去传递 → BCNF 箭头全超码)→ 规范化消除三异常、性能权衡。
- 必背计算:候选码求法(入度 0 + 闭包覆盖全集,2024 单52);范式等级判定(找码→找非主属性→查部分/传递,2025 单53)。
- 必背对应:1NF=原子(2018 单52);2NF=非主属性完全依赖码;3NF=非主属性无传递依赖;BCNF=决定因素全含码(2023 单44)。
- 衔接预告:主键/外键约束→4.1 完整性;规范化在逻辑设计阶段执行→4.4;索引/反规范化→4.6 优化。