首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 邏輯設計基石:實體關係圖 (ERD) 規範、關係類型與關係模型映射全解析

     編輯:Oracle 資料庫基礎

「磨刀不誤砍柴工」—— **邏輯設計 (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` 重組完整視圖

進階建模技巧

  1. 識別與非識別關係:FK 是否為子表 PK 一部分。識別關係 (實線) 表達強生命週期綁定 (如 `ORDER_LINE` PK 含 `ORDER_ID`)。
  2. 遞迴關係:實體自我關聯 (如 `EMPLOYEE.MGR_ID → EMPLOYEE.EMP_ID`),ERD 繪製為實體自連線,角色名區分 (Manager/Subordinate)。
  3. 歷史/稽核屬性:統一在所有表加入 `CREATED_BY, CREATED_DT, MODIFIED_BY, MODIFIED_DT, VERSION`,或建立獨立稽核表 (觸發器/CDC 填充)。
  4. 命名規範:表名單數 (EMPLOYEE)、PK 命名 `PK_`、FK 命名 `FK__`、索引 `IDX_
    _`。

    驗證清單:一份合格的 ERD 必須通過

    • [ ] 所有實體有業務定義、主鍵、至少一個非鍵屬性
    • [ ] 所有關係有名稱、基數、參與度 (Mandatory/Optional)
    • [ ] 無未拆解的 M:N 關係
    • [ ] 子類型含 Type Code、完整性規則 (Total/Partial, Disjoint/Overlap) 明確標記
    • [ ] 符合 3NF/BCNF (無傳遞相依、無部分相依)
    • [ ] 關鍵業務查詢可在模型上走通 (無缺失路徑)
    • [ ] 已與業務專家走查確認、簽核

    **結論:** ERD 不是文檔裝飾,而是**資產級交付物**。投入時間打磨 ERD,就是在為後續的物理設計、效能調優、擴展維護買最便宜的保險。工具推薦:ER/Studio, ERwin, DataGrip, dbdiagram.io (輕量)、Draw.io (草圖)。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved