「磨刀不誤砍柴工」—— **邏輯設計 (Logical Design)** 是資料庫專案成敗的關鍵。跳過 ERD 直接進物理設計,必然導致後期返工、效能災難、資料不一致。本文系統闡述 **實體關係圖 (ERD) 核心符號、三大關係類型、子類型關係、多對多拆解、向關係模型映射** 完整方法論,助您建立經得起時間考驗的邏輯藍圖。
為何必須先做 ERD?
- 語義優先:ERD 捕捉「業務本質」(語義模型),關係模型處理「結構」(語法模型);語義錯誤無法由語法修正。
- 變更成本指數級增長:邏輯階段調整實體/關係成本 = 1;物理階段調整表/索引 = 10;上線後重構 = 1000+。
- 溝通橋樑:業務專家看得懂 ERD,看不懂 DDL;開發看得懂關係模型,看不懂業務流程。ERD 是雙方共同語言。
ERD 核心符號規範 (採用 Crow's Foot / IE 標記法,業界通用)
| 元素 | 圖形 | 說明 |
| 實體 | 矩形框 | 高層圖:僅寫實體名;低層圖:上部實體名,下部列出屬性 (Attribute) |
| 屬性 | 實體框內列表 | PK 標記 `#`,FK 標記 `(FK)`,Mandatory `*`,Optional `o` |
| 關係 | 連線 + 端點符號 | 見下表三大基本類型 |
三大基本關係類型與端點符號
| 類型 | 端點符號 (父:子) | 業務含義 | 範例 |
| 一對一 (1:1) | 單箭頭 : 單箭頭 | 父實體每筆對應子實體**零或一筆**,反之亦然 | 員工 : 護照細節 (非每人都有護照) |
| 一對多 (1:N) | 單箭頭 : 雙箭頭 (Crow's Foot) | 父實體一筆對應子實體**零到多筆** | 部門 : 員工 (最常見) |
| 多對多 (M:N) | 雙箭頭 : 雙箭頭 | 雙向多筆對應,**關係模型無法直接實現** | 學生 : 課程、員工 : 專案 |
特殊關係:子類型關係 (Subtype / Supertype) —— 物件導向的基石
- 結構:超類型 實體包含共同屬性;子類型 實體繼承並擴展特有屬性。
- 繼承方向:一般 → 特殊 (Generalization → Specialization)。
- 判別欄位:超類型需含 **Type Code** (如 `EMP_TYPE = 'FULL'/'PART'/'CONTRACT'`) 決定具體子類型。
- 完整性規則:
- **Total Specialization (完全):** 每個超類型實例**必須**屬於某子類型 (雙線連接)。
- **Partial Specialization (部分):** 允許超類型實例不屬於任何子類型 (單線連接)。
- **Disjoint (互斥):** 實例**只能**屬於一個子類型 (字母 `d` 標記)。
- **Overlapping (重疊):** 實例可同時屬於多個子類型 (字母 `o` 標記)。
多對多關係拆解:交叉實體 / 連接表 / 紐帶表
關係模型要求**原子性 (1NF)**,單欄位不可存多值。因此 M:N **必須拆解為兩個 1:N**。
原始 M:N 拆解後
學生 ──────── 課程 學生 1:N 選課 N:1 課程
↓
選課 實體
(PK: 學號+課號)
屬性: 成績、學期、狀態
- 交叉實體**不一定對應真實業務實體**,但它是實現 M:N 的**唯一標準方法**。
- 命名慣例:`<實體A>_<實體B>` (如 `STUDENT_COURSE`) 或業務語義名 (如 `ENROLLMENT`)。
- 主鍵通常為**複合鍵** (兩側 FK 組合),亦可加代理鍵 (Surrogate Key) 便於外鍵引用。
ERD 向關係模型映射規則 (自動化/手工通用)
| ERD 元素 | 關係模型產物 | 關鍵規則 |
| 實體 | 關係/表 | 實體名 → 表名 (單數、大寫、無空格) |
| 屬性 | 欄位 | PK → PRIMARY KEY;FK → FOREIGN KEY REFERENCES 父表(PK);Mandatory → NOT NULL |
| 1:N 關係 | 子表加 FK | 父表 PK 遷移至子表成為 FK;父刪除規則 (CASCADE/SET NULL/RESTRICT) 依業務定 |
| 1:1 關係 | 合併或分表 | **優先合併** (除非業務強制分離、安全隔離、擴展性);分表則一方 PK 兼作 FK |
| M:N 關係 | 交叉表 | 兩側 PK 遷移至交叉表組成複合 PK;各自加 FK 回原表 |
| 子類型 | 超類型表 + 子類型表 | 超類型 PK 遷移至子類型作 PK 兼 FK;Type Code 判別;視圖 `UNION ALL` 重組完整視圖 |
進階建模技巧
- 識別與非識別關係:FK 是否為子表 PK 一部分。識別關係 (實線) 表達強生命週期綁定 (如 `ORDER_LINE` PK 含 `ORDER_ID`)。
- 遞迴關係:實體自我關聯 (如 `EMPLOYEE.MGR_ID → EMPLOYEE.EMP_ID`),ERD 繪製為實體自連線,角色名區分 (Manager/Subordinate)。
- 歷史/稽核屬性:統一在所有表加入 `CREATED_BY, CREATED_DT, MODIFIED_BY, MODIFIED_DT, VERSION`,或建立獨立稽核表 (觸發器/CDC 填充)。
- 命名規範:表名單數 (EMPLOYEE)、PK 命名 `PK_