動態網站效能與擴展性的基石在於資料庫設計。正規化是消除冗餘與不當相依的系統化方法。本系列五篇將帶您從零狀態逐步推進至 5NF,首篇聚焦 0NF → 1NF 轉換與主鍵建立。
情境:建立用戶資訊表,含姓名、公司、公司地址、個人收藏網址。
users (0NF): name | company | company_address | url1 | url2 Joe | ABC | 1 Work Lane | abc.com | xyz.com Jill | XYZ | 1 Job Street | abc.com | xyz.com
url1, url2 為同一語意欄位橫向展開ALTER TABLE ADD url3 — 結構變更成本高、易破壞相容性WHERE url1='abc.com' OR url2='abc.com'三大規則:
users (1NF): userId | name | company | company_address | url 1 | Joe | ABC | 1 Work Lane | abc.com 1 | Joe | ABC | 1 Work Lane | xyz.com 2 | Jill | XYZ | 1 Job Street | abc.com 2 | Jill | XYZ | 1 Job Street | xyz.com
| 解決 | 新問題 |
|---|---|
| URL 數量無上限,垂直擴展 | 公司/用戶資訊隨每個 URL 重複 (Joe 的 ABC/1 Work Lane 出現 2 次) |
查詢 URL 變簡單 (WHERE url='abc.com') | 資料量膨脹、寫入易出錯 (公司地址改變需更新多筆) |
| 符合關聯模型「單值屬性」原則 | 違反 2NF:非鍵欄位 (company) 部分相依主鍵 (userId+url) |
UNIQUE 約束保護第二篇將實作 2NF:抽離 URL 獨立表,建立 users.userId → urls.relUserId 外鍵關聯,解決公司資訊重複問題的前奏。