關聯式資料庫設計 3:資料庫關聯完整性限制
學習關聯式資料庫設計中的五種限制
August 28, 2026上一篇關聯式資料庫設計 2 資料庫設計步驟、概念資料模型以及實體關係圖,說明了資料庫的設計步驟,以及什麼是概念資料模型還有實體關聯圖(ERD),在開始本篇之前,先做簡單的複習。
資料庫設計步驟:
- 確認需求:確認商業或使用者的資料需求,了解資料如何被使用
- 概念資料模型:描繪資料庫的「整體」,但不標示細節,建立實體關聯圖 (Entitiy Relation Diagram)
- 邏輯設計:將實體關係圖轉為帶有主鍵(Primary Key) 和外鍵,來定義資料表以及資料表之間的關係
- 實體設計:為屬性定義資料型態以及定義效能所需的索引
- 實作實體設計:選擇 RDBMS(關聯式資料庫管理系統)並使用 SQL 建立資料庫綱要(Schema)
- 測試與實作
- 維護與文件化
概念資料模型元素:
- 實體: 儲存所需資料的資料庫物件(即資料表)
- 屬性: 實體的特性或屬性(即資料表內的欄位)
- 關聯: 顯示實體之間是如何互相連結的
- 基數: 描述實體間連結關係的型態(例如一對一、一對多、多對多等)
但上述沒有說明一個「好的」資料庫設計應該具備什麼?本篇會介紹「關聯完整性限制」(Relational Integrity Constraints),它的目的在於確保資料正確性、一致性以及邏輯嚴謹性。
關聯完整性限制(Relational Integrity Constraints)
定義域限制 (Domain Constraint)
規定欄位(屬性)只能填入符合該型態與規範的值。實務上例如當我們規範一筆資料的型態為 VARCHAR,那就必須確保資欄位不能存成文字以外的型態。
-
✅
age設定成整數,並加上CHECK (age >= 0) -
❌
age欄位型態為INTEGER,但是欄位沒鎖好,導致允許-5或者15歲
關聯鍵限制 (Key Constraint)
規範資料表中的鍵值(Super Key、Candidate Key、Primary Key、Alternate Key、Foreign Key)。確保資料具備唯一識別,並規範表格間的正確對應。
-
✅
customer_id設定為 PK,資料庫會限制資料不得擁有一樣的 ID -
❌ 沒有設定主鍵,導致共用了
customer_id
實體完整限制 (Entity Integrity Constraint)
主鍵(Primary Key)絕對不能為空值(NULL)。如果主鍵允許空值,資料庫就失去了一個能夠絕對識別某筆記錄的依據
-
✅ 將
order_id設為主鍵,若有人試圖寫入order_id為NULL的資料,資料庫會報錯 -
❌ 新增一筆訂單,可能因為漏傳而讓
order_id變成NULL,以致無法查詢或修改
參考完整限制 (Referential Integrity Constraint)
為了防止產生「孤兒資料」(Orphaned Records),外來鍵(Foreign Key)若有填寫內容,就必須確實對應到另一個表格中存在的主鍵。
-
✅ 幫訂單表格內的
customer_id建立外鍵(FK),如果嘗試寫入不存在的customer_id = 9999會報錯 -
❌ 訂單內有一筆資料的
customer_id = 9999,這名客戶已經被刪除但訂單沒有刪,這可能會導致程式出錯
語意完整限制 (Semantic Integrity Constraint)
有時會因為專案特性,必須根據特定業務邏輯(Business Logic)所自定義的額外規則。可透過 CHECK 或程式邏輯來實踐。
-
✅ 在資料庫加入檢查條件:
CHECK (discount_rate >= 0 AND discount_rate <= 1)(折扣只能在 0 到 1 之間),或CHECK (shipping_date >= order_date)。 -
❌ 促銷活動的折扣 (
discount_rate) 欄位被填了 1.5(代表打 150折),造成公司虧損,或者訂單的「出貨日期」早於「下單日期」。