/cn-tutor-prep-s5-ict-database-normalisation/
/cn-tutor-prep-s5-ict-database-normalisation/
一般查询: info@TutorZone.com.hk
办公时间: 星期一至六 - 上午 9 时至下午 6 时
WhatsApp 星期一至日 - 24 小时
人手接听: +852 6828 1809
实时客服: +852 9061 3106

中五 ICT|数据库正规化(1NF/2NF/3NF)备课指引(导师用)|45 分钟流程、讲解脚本、常见错误

中五 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 家课建议(直接指到练习卷题号)

08 离场检查(最后 5 分钟)

题目 答案 判定
500 行、20 个客户,客户名重复几多次? 480 次 错:下堂重教第一幕,重复的计法
复合键表出现货品名,违反边一个正规化? 2NF,部分依赖 错:重教第二幕,非键栏只依赖一半键
Orders 表出现客户名,违反边一个正规化? 3NF,传递依赖 错:重教第三幕,主键决定甲、甲决定乙

09 导师常问

这一章适合几年级?

香港中五 ICT 的数据库单元要求学生设计关联表并解释正规化。中四学过的主键、字段类型同简单查询是前置,未学过的要先补“一栏决定另一栏”这个讲法。

45 分钟够不够?

够,但第三幕要留十分钟。学生最易卡在分辨 2NF 同 3NF,所以白板要同时写住两个问题:“它依赖主键的一部分吗?”“它是转一手才依赖吗?”

一定要背正规化的定义吗?

不需要逐字背。考试要的是判断同拆表,所以记住三个动作:一格一值、不好只依赖一半键、不好转手依赖。

立即免费找导师导师登记 →

本页为 TutorZone 导师备课指引,内容由 TutorZone 团队编写;题目与流程为原创,并非任何学校或出版社的教材。

本页内容版权属 TutorZone 所有 · www.tutorzone.com.hk · 仅供个人学习及教学使用

招募导师及兴趣班教练|学术、乐器、体育、艺术、STEM,免费登记,招生与配对交给平台。 了解详情 →