中五 ICT|数据库正规化(1NF/2NF/3NF)备课指引(导师用)|45 分钟流程、讲解脚本、常见错误
- 2026-11-15
学生背得出“第一、第二、第三正规化”,但见到一张 500 行的订单表就讲不出要拆哪一栏。这一堂把三个名词变成一条可以逐栏检查的动作。
本堂目标 本堂完结时学生能够:(1)讲出 1NF 要求每格一个原子值,并示范把两个电话号码拆成两行;(2)认出复合键下的部分依赖,讲出 ItemName 只依赖 ItemID 所以违反 2NF;(3)认出传递依赖,讲出 Orders 表的 CustomerName 要拆去 Customers;(4)把 500 行订单表拆成 Customers 20 行、Items 50 行、Orders 120 行、OrderLines 500 行四张表,并用外键连回去。
01 先备知识(开课前 3 分钟快检)
以下任何一项未过关,本堂就会卡住,先补该项:
| 技能 | 快检题 | 过关标准 |
|---|---|---|
| 主键 | 一张订单表可以用边一栏唯一识别每一行 | 答 订单编号 |
| 函数依赖 | 货品编号固定之后,货品名称会不会跟住变 | 答 不会,由货品编号决定 |
| 百分比 | 500 行里得 20 个客户名,重复的比例系几多 | 答 96%,即 480 行是重复 |
| 复合键 | (订单编号+货品编号)代表什么 | 答 两栏合起来才唯一识别一行 |
02 课堂流程(45 分钟)
| 时间 | 环节 | 导师做什么 | 学生做什么 |
|---|---|---|---|
| 0–6 分钟 | 起点快检 | 问主键、函数依赖、重复比例,答案写白板右边整堂不擦 | 口头答,算式写在纸上 |
| 6–16 分钟 | 第一幕:三种异常是同一个病 | 500 行订单表,20 个客户,每个名字出现 25 次;示范改地址、删单、加新客三个场景 | 学生讲出三种异常各自发生什么事 |
| 16–26 分钟 | 第二幕:1NF 与 2NF | 一格两个电话要拆行;复合键下 ItemName 只依赖 ItemID,属部分依赖,要拆 Items 表 | 学生指出表里哪一栏违反 2NF |
| 26–36 分钟 | 第三幕:3NF 与外键 | OrderID 决定 CustomerID,CustomerID 决定 CustomerName,属传递依赖,拆 Customers 表 | 学生讲出四张表同两条外键 |
| 36–42 分钟 | 题型示范与拆表练习 | 同一张表换成 800 行,学生照三个问题逐栏检查 | 学生交出一张拆表图 |
| 42–45 分钟 | 离场检查 | 三题口头,错的记下是哪一幕 | 三题全对 |
03 讲解脚本(照着说就可以)
第一幕:第一幕:三种异常,同一个病根
“想像一张表,每行是一条订单细项:订单编号、客户编号、客户名、客户地址、货品编号、货品名、单价、数量。500 行里只有 20 个客户,所以每个客户名平均出现 25 次,重复的有 480 行,占九成六。第一个病是更新异常:客户搬屋,你要改 25 行,改漏一行,同一个客户就有两个地址。第二个是删除异常:他最后一张订单取消,你删走那行,客户的资料也一齐消失。第三个是插入异常:新客户未落单,你根本没有位放他。三个病都是同一件事——同一份事实重复存了许多次。”
“如果要改一个客户的地址,你要改几多行?漏改一行会出现什么问题?”
第二幕:第二幕:1NF 讲一格一个值,2NF 讲不好只依赖一半键
“第一正规化最简单:每一格只放一个值。电话栏写住两个号码,就要拆成两行,或者开一张客户电话表。第二正规化要你望复合键。OrderLines 的主键是(订单编号+货品编号),但货品名同单价其实只要货品编号就决定得到,同订单编号完全无关。这叫部分依赖:非键栏只依赖主键的一部分。解法是把货品编号、货品名、单价搬去一张 Items 表,50 件货就只存 50 行,不再重复 500 次。”
“客户名依赖的是客户编号,不依赖订单编号,这样算是 2NF 问题吗?”
第三幕:第三幕:3NF 讲不好转一手才依赖
“拆完 2NF,Orders 表剩低订单编号、客户编号、客户名、客户地址。这里有条链:订单编号决定客户编号,客户编号再决定客户名。客户名不是直接依赖主键,是转了一手,这叫传递依赖,违反第三正规化。解法是拆一张 Customers 表,只留客户编号、客户名、电话、地址。最后四张表:Customers 20 行、Items 50 行、Orders 120 行、OrderLines 500 行。OrderLines 放两个外键——订单编号同货品编号——三张表就靠这几条外键 JOIN 返成一张完整订单,行数仍然是 500 行,一行不少。”
“Orders 表里的客户名,是直接依赖订单编号,还是转了一手?”
04 必教题型与步骤
| 题型 | 例子 | 步骤 | 答案 |
|---|---|---|---|
| 判断 1NF | 电话栏写住“9123 4567 / 6234 5678” | 每格只可一个原子值,多值要拆行或开新表 | 拆成两行电话,或开一张 CustomerPhone 表 |
| 判断 2NF | 主键是(订单编号+货品编号),表内有货品名同单价 | 货品名只依赖货品编号,属部分依赖 | 拆出 Items(货品编号、货品名、单价),50 行 |
| 判断 3NF | Orders 表内有客户名同客户地址 | 主键决定客户编号,客户编号再决定客户名,属传递依赖 | 拆出 Customers(客户编号、客户名、地址),20 行 |
| 写外键 | 拆完之后 OrderLines 要有什么栏才可以 JOIN 返去 | 两个外键加上数量 | 订单编号、货品编号、数量 |
合理性检查(一定要教):三个复核:(1)拆完之后把四张表 JOIN 返,行数要仍然是 500,少一行就是漏了外键;(2)逐个非键栏问一次“改这个值要改几行”,答案大于一就仲有重复;(3)表数不是越多越好,四张表刚好,拆到七张就每次查询要 JOIN 六次,考试时间都蚀埋。
05 独立练习三题
| 题目 | 答案 | 想观察什么 |
|---|---|---|
| 500 行订单细项、20 个客户,客户名重复了几多次? | 480 次(500 减 20) | 确认是用行数减客户数,不是乘 |
| 未正规化时改一个客户电话要改 25 行,正规化之后改几多行? | 1 行,只改 Customers 表 | 确认明白重复消除了,改动就跟住减少 |
| 120 张订单、500 行细项,平均每张单几多项? | 4.17 项 | 500 除 120,答案可以有小数 |
06 学生常见错误与纠正句
| 错误 | 学生通常这样写 | 导师这样说 |
|---|---|---|
| 以为拆表越多越好 | 把一张表拆到七张,然后每个查询要 JOIN 六次 | 正规化的目标是消除异常,不是追求表数。做到 3NF 没有异常就停,多拆只会令查询更难写。 |
| 把 2NF 同 3NF 混淆 | 见到 CustomerName 就话系 2NF 问题 | CustomerName 依赖 CustomerID,不依赖复合键任何一部分,所以是 3NF 的传递依赖。先问“它依赖边一栏”。 |
| 拆完漏外键 | 拆了 OrderLines 但没有留订单编号 | 拆表之后一定要问“这两张表靠边一栏连返去”。没有外键就 JOIN 不返,500 行会变成断开的碎片。 |
| 把 1NF 当成“不好留空” | 电话栏留空就话符合 1NF | 1NF 讲的是每格一个原子值,多值要拆行;空白是缺值问题,不是正规化问题。 |
07 家课建议(直接指到练习卷题号)
- 中五 ICT 练习卷第一份|数据库部分 Section C 第 9–12 题
08 离场检查(最后 5 分钟)
| 题目 | 答案 | 判定 |
|---|---|---|
| 500 行、20 个客户,客户名重复几多次? | 480 次 | 错:下堂重教第一幕,重复的计法 |
| 复合键表出现货品名,违反边一个正规化? | 2NF,部分依赖 | 错:重教第二幕,非键栏只依赖一半键 |
| Orders 表出现客户名,违反边一个正规化? | 3NF,传递依赖 | 错:重教第三幕,主键决定甲、甲决定乙 |
09 导师常问
这一章适合几年级?
香港中五 ICT 的数据库单元要求学生设计关联表并解释正规化。中四学过的主键、字段类型同简单查询是前置,未学过的要先补“一栏决定另一栏”这个讲法。
45 分钟够不够?
够,但第三幕要留十分钟。学生最易卡在分辨 2NF 同 3NF,所以白板要同时写住两个问题:“它依赖主键的一部分吗?”“它是转一手才依赖吗?”
一定要背正规化的定义吗?
不需要逐字背。考试要的是判断同拆表,所以记住三个动作:一格一值、不好只依赖一半键、不好转手依赖。
本页为 TutorZone 导师备课指引,内容由 TutorZone 团队编写;题目与流程为原创,并非任何学校或出版社的教材。
本页内容版权属 TutorZone 所有 · www.tutorzone.com.hk · 仅供个人学习及教学使用


