承接前兩篇,本文進入第四正規化 (4NF) 與第五正規化 (5NF) 領域,核心聚焦於多對多關聯的結構優化,並說明正規化理論淵源。
| 類型 | 說明 | 常見度 |
|---|---|---|
| 一對一 (1:1) | 雙方各唯一對應 | 較少見,通常合併同表 |
| 一對多 (1:N) | 一方對應多方 | 最常見 (如:客戶-訂單) |
| 多對多 (M:N) | 雙方皆可對應多筆 | 需中介表解析 |
users: userId | name | relCompId companies: compId | company | company_address urls: urlId | url url_relations: relationId | relatedUrlId | relatedUserId
問題:urls 表中同一 URL 可能被多用戶重複儲存 (如 abc.com 出現多次)。
4NF 定義:在多對多關聯中,獨立實體不得存放於同一表格。
建立專門關聯表 url_relations,欄位全為主鍵或外鍵:
url_relations: relationId | relatedUrlId (FK→urls) | relatedUserId (FK→users) 1 | 1 | 1 2 | 1 | 2 3 | 2 | 1 4 | 2 | 2
效果:urls 表每個 URL 僅存一筆,徹底消除重複。
-- 查詢 Joe 的所有 URL
SELECT u.name, url.url
FROM users u, urls url, url_relations ur
WHERE ur.relatedUserId = 1
AND u.userId = 1
AND url.urlId = ur.relatedUrlId;
-- 遍歷所有人的 URL
SELECT u.name, url.url
FROM users u, urls url, url_relations ur
WHERE u.userId = ur.relatedUserId
AND url.urlId = ur.relatedUrlId;
原則:原始表格必須可由分解出的表格透過連接 (JOIN) 重建,且不引入額外欄位。
| 階段 | 適用場景 | 成本/收益 |
|---|---|---|
| 1NF | 消除重複群組、建立主鍵 | 必要,基礎門檻 |
| 2NF | 消除部分相依 (非鍵欄位相依部份主鍵) | 必要,複合主鍵表必做 |
| 3NF | 消除遞移相依 (非鍵欄位相依非鍵欄位) | 必要,多數專案到此結束 |
| 4NF | 消除多值相依 (M:N 關聯冗餘) | 視 M:N 複雜度決定 |
| 5NF | 消除連接相依 | 極少數極複雜系統才需 |
正規化不是教條,而是依業務複雜度權衡結構清晰度與查詢效能的工具。大多數 OLTP 系統 3NF 即足夠;含大量 M:N 關聯的系統 (如標籤系統、推薦引擎) 需 4NF;極罕見情況才觸及 5NF。理解原理,才能在實務中做出正確取捨。