中五 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 · 僅供個人學習及教學使用


