關聯模型:從資料表讀懂鍵與限制
本頁為依教材與考古題整理的原創摘要;考古題答案經技術覆核,但不是官方答案。
第一次接觸也沒關係
這堂先懂這些詞
先記住白話意思,不必急著背英文。看到正文時,再把正式名稱接回來。
資料完整性限制
也會看到:entity integrity、referential integrity、constraint用規則防止資料缺少必要識別或指向不存在的紀錄。
- 生活例子:
- 訂單不能沒有訂單編號,也不能填一個根本不存在的會員編號。
- 別搞混:
- 限制是在寫入時維護資料可信度,不等於事後報表驗證。
主鍵與外鍵
也會看到:primary key、foreign key、PK、FK、主鍵、外來鍵主鍵唯一識別本表資料,外鍵則指向另一表的主鍵來建立關係。
- 生活例子:
- 身分證字號辨認一個人,訂單上的會員編號則連回會員資料。
- 別搞混:
- 外鍵不一定唯一;它的重點是參照完整性,不是替資料排序。
關聯模型
也會看到:relation、tuple、attribute、domain、schema用資料表表示關係;列是 tuple、欄是 attribute,schema 則規定表的結構。
- 生活例子:
- 像班級名冊:每位學生是一列,姓名與學號是欄位。
- 別搞混:
- relation 在理論上不是單純有順序的試算表;列的先後通常沒有語意。
以 relation、tuple、attribute 為起點,建立主鍵、候選鍵、外鍵與參照完整性的判讀方法,並連結歷屆題常考的資料庫優勢與表格結構。
先抓住這幾件事
- 分辨 relation schema、relation instance、tuple、attribute 與 domain
- 從欄位限制判斷 superkey、candidate key、primary key 與 composite key
- 檢查 entity integrity、referential integrity 與常見欄位限制
- 用關聯模型解釋資料庫相對於一般檔案系統的優勢
先想像這個場景
大學選課系統的三本名冊
教務處有學生、課程與選課三份名冊。學生編號能找到唯一學生,課號能找到唯一課程,而選課紀錄必須同時看學生編號與課號才知道是哪一次選課。若選課表寫了 S9,學生名冊卻沒有 S9,系統就留下了一筆找不到人的紀錄。
先別急著往下看,花十秒想一想:
Enrollment 出現 (sid='S9', cid='DB01', grade=NULL):Student 沒有 S9,而且 grade 沒有宣告 NOT NULL。哪一部分必然違反限制?
把故事換成電腦語言
| 生活中的角色 | 對應到 | 技術概念 |
|---|---|---|
| 空白名冊先規定欄名、填寫格式與限制 | relation schema 描述 attributes、domains 與 constraints | |
| 今天名冊中實際填好的每一列資料 | relation instance 是某一時刻的 tuples 集合 | |
| 從學號與 email 等唯一欄位中,正式選學號作主要識別 | 先找具唯一性與最小性的 candidate keys,再選一個作 primary key | |
| 同一學生可修多門課,同一課也有多名學生,因此要用學號加課號識別選課紀錄 | Enrollment 的 (sid, cid) 是 composite key | |
| 選課名冊上的學號必須能回學生名冊找到本人 | foreign key 與 referential integrity 限制跨 relation 的合法關係 |
題目出現這些字,先想到
- 表的結構、欄位與限制是 schema;某一時刻實際資料是 instance。
- 能唯一識別只是 superkey;再滿足移除任何欄位就失去唯一性的最小性,才是 candidate key。
- 被選中的 candidate key 是 primary key,必須唯一且不可為 NULL;它也可能由多欄組成。
- Foreign key 值必須找到被參照鍵,或在欄位允許時為 NULL;不要把所有 NULL 一律判錯。
1.一張表不只是試算表
關聯式資料庫(relational database)的基本單位是 relation(關聯),在實務中通常稱為 table(資料表)。一個 relation 由兩部分組成:schema(結構定義,包含表名和各 attribute 的名稱與型態)和 instance(實際的資料列集合)。每一列稱為 tuple(元組/row/record),每一欄稱為 attribute(屬性/column/field)。 【和試算表的差異】關聯式資料表看起來像 Excel 試算表,但有本質差異:(1) 每個 attribute 有明確的 domain(值域),例如「年齡」欄位只能是正整數。(2) 在理論上,tuple 之間沒有順序 — 不能靠「第三列」來引用資料。(3) 每個 attribute 值必須是 atomic(原子性的,不可再分割的)— 這是 1NF 的基本要求。(4) 透過 constraint(約束)來維護資料完整性,試算表沒有這個機制。 Relation 的 degree 是 attribute 的數量(欄數),cardinality 是 tuple 的數量(列數)。注意這裡的 cardinality 和 ER model 中的 cardinality(relationship 的對應數量)是不同的概念,考古題常故意混淆。 【考試連結】題目常要你區分 relation、table、schema、instance、tuple、attribute 等術語。記住 relation = table,tuple = row,attribute = column,schema = 結構定義,instance = 資料內容。最常見的陷阱是把 relation 的「cardinality」(行數)和 ER 的「cardinality」(關係對應數)搞混。
- schema 描述結構,instance 描述某一時刻的內容
- tuple 對應資料列,attribute 對應欄位
- domain 同時限制資料型別與可接受的值域
- 關聯在數學上是 tuple 的集合,因此列的先後順序沒有語意
2.用最小性判斷各種鍵
在關聯式模型中,鍵(key)是用來唯一識別每個 tuple 的 attribute 或 attribute 組合。不同類型的鍵各有定義: • Super key(超鍵):能唯一識別所有 tuple 的任何 attribute 組合。例如 {學號}、{學號, 姓名}、{學號, 姓名, 生日} 都是 super key — 只要包含學號就能唯一識別。 • Candidate key(候選鍵):最小的 super key — 不能再移除任何 attribute 仍保持唯一識別能力。例如 {學號} 是 candidate key,但 {學號, 姓名} 不是(因為移除姓名後仍能唯一識別)。一個 relation 可以有多個 candidate key。 • Primary key(主鍵):從 candidate keys 中選定的一個作為主要識別依據。每個 relation 只有一個 primary key。Primary key 的值不能是 NULL。 • Alternate key(替代鍵):沒被選為 primary key 的其他 candidate keys。 【判斷方法 — 最小性】判斷一個 attribute 組合是否為 candidate key,關鍵看「最小性」:(1) 它能唯一識別嗎?如果不能 → 連 super key 都不是。(2) 移除任何一個 attribute 後仍能唯一識別嗎?如果可以 → 它不是最小的,只是 super key 不是 candidate key。 【具體範例】學生表(學號, 身分證, 姓名, 系所):{學號} 和 {身分證} 各自能唯一識別 → 都是 candidate key。{學號, 身分證} 能唯一識別但不是最小的 → 只是 super key。選 {學號} 為 primary key,則 {身分證} 是 alternate key。 【考試連結】選擇題常給一個 relation 的 functional dependency 集合,要你找出所有 candidate keys。步驟:找出所有能推導出全部 attribute 的最小 attribute 組合。
- 每個 candidate key 都是 superkey,但 superkey 不一定最小
- primary key 是被選中的 candidate key,不等於所有 UNIQUE 欄位
- 複合鍵常出現在 Enrollment、OrderItem 等關聯表
- primary key 不可為 NULL,且每列必須唯一
3.外鍵維持跨表一致
Foreign key(外鍵)是一個 relation 中引用另一個 relation 之 primary key 的 attribute。它的作用是建立表與表之間的關聯,並維護 referential integrity(參照完整性)— 確保每個外鍵值都對應到被引用表中的一個有效 tuple。 【運作機制】假設有兩個表: • 學生表(學號 PK, 姓名, 系所代碼 FK) • 系所表(系所代碼 PK, 系名) 學生表中的「系所代碼」是 foreign key,引用系所表的「系所代碼」。Referential integrity 約束要求:學生表中每個非 NULL 的系所代碼值,都必須在系所表中存在。這意味著:(1) 不能在學生表中填入一個系所表中不存在的系所代碼。(2) 不能刪除系所表中仍被學生表引用的系所。 【Foreign key 可以是 NULL 嗎?】可以!Foreign key 允許 NULL(除非額外設定 NOT NULL 約束),表示「目前未指定」。例如一個學生暫時還沒選定系所。但 primary key 絕對不能是 NULL。考古題 112-22 就考過這個概念 — 「FK 不可以是 NULL」是錯誤的。 【Foreign key 可以是 composite 嗎?】可以。如果被引用的 primary key 是由多個 attribute 組成的 composite key,那麼 foreign key 也必須包含相同數量的 attribute。 【On Delete/Update 行為】當被引用的 tuple 被刪除或更新時,常見的處理方式:CASCADE(連帶刪除/更新引用方)、SET NULL(將外鍵設為 NULL)、RESTRICT(禁止操作)。考古題通常不考具體 SQL 語法,但會考概念理解。
- 同一張表可以有多組 foreign keys
- 外鍵可以是 composite,也可以參照同一張表
- 未加 NOT NULL 時,foreign key 通常可以是 NULL
- 外鍵的核心是限制合法關係,不是自動提升查詢速度
4.為什麼不用一堆檔案就好
在關聯式資料庫出現之前,組織通常用檔案系統(file-based approach)管理資料:每個應用程式維護自己的資料檔案。這種方式會產生嚴重的問題: (1) Data redundancy(資料冗餘):同一筆資料在多個檔案中重複存放。例如員工姓名同時出現在人事檔案、薪資檔案和考勤檔案中。 (2) Data inconsistency(資料不一致):冗餘導致更新時可能只改了部分副本。例如員工改名後只更新了人事檔案,薪資檔案中還是舊名字。 (3) Data isolation(資料孤島):不同檔案格式不統一,跨檔案查詢困難。人事系統用 CSV,薪資系統用自訂二進位格式,要做聯合查詢需要寫特殊的轉換程式。 (4) 缺乏 concurrency control:多個使用者同時存取同一檔案可能造成資料損壞。 (5) 缺乏完整性約束:檔案系統不能強制「薪資必須 > 0」或「部門代碼必須存在」等規則。 【DBMS 的解決方案】資料庫管理系統(DBMS)把所有資料集中管理,提供:schema 定義、SQL 查詢語言、交易管理(ACID)、存取控制、備份復原、並行控制。應用程式透過 DBMS 的介面存取資料,不直接操作檔案。這個介於應用程式和實體資料之間的抽象層稱為 data independence — 改變實體儲存方式不需要修改應用程式。 【考試連結】申論題常問「比較檔案系統和 DBMS 的優缺點」。DBMS 的缺點包括:初始建置成本高、需要專業 DBA 維護、對簡單應用可能是 overkill。檔案系統在某些場景(如嵌入式系統、超高效能需求)仍有其價值。
- 集中 constraints 可在多個應用程式之間維持一致規則
- 查詢最佳化讓使用者描述要什麼,而非逐筆指定怎麼找
- 減少 redundancy 也會降低 insert、update、delete anomalies
- data independence 分為 logical 與 physical 兩個層次
一起拆題目
範例 1:有 Student(sid PRIMARY KEY, email UNIQUE NOT NULL, name)、Course(cid PRIMARY KEY, title) 與 Enrollment(sid REFERENCES Student(sid), cid REFERENCES Course(cid), grade, PRIMARY KEY (sid, cid))。已知 sid 與 cid 皆不可為 NULL。請找出候選鍵、主鍵與外鍵。
- Student 中 sid 與 email 都能單獨唯一識別 tuple,所以兩者都是 candidate keys;選 sid 作 primary key,email 保留 UNIQUE。
- Course 的 candidate key 與 primary key 都是 cid。
- Enrollment 必須合併 sid 與 cid 才能唯一識別選課紀錄,所以 (sid, cid) 是 composite primary key。
- Enrollment.sid 參照 Student.sid;Enrollment.cid 參照 Course.cid,兩者都是 foreign keys。
所以答案是:Student:PK sid、alternate key email;Course:PK cid;Enrollment:PK (sid,cid),並有兩個分別參照 Student 與 Course 的外鍵。
範例 2:Enrollment.sid 已宣告為參照 Student.sid 的 foreign key,grade 未宣告 NOT NULL。現在出現 (sid='S9', cid='DB01'),但 Student 沒有 S9;另一列的 grade 為 NULL。哪一筆必然違反關聯限制?
- 先檢查外鍵:S9 必須存在於 Student.sid,否則破壞 referential integrity。
- 再檢查 grade:一般 attribute 是否允許 NULL 取決於 schema,題目沒有給 NOT NULL。
- 不要把所有 NULL 都視為錯誤;primary key 與明示 NOT NULL 的欄位才必然禁止 NULL。
所以答案是:S9 那筆必然違反參照完整性;grade=NULL 是否違規要看 grade 的欄位限制。
這裡最容易選錯
- 把任何能唯一識別資料的欄位集合都叫 candidate key,忘了 candidate key 還要具備最小性
- 認為 foreign key 一律不可為 NULL;是否可為 NULL 由欄位的 NOT NULL 限制決定
- 把 schema 與 data dictionary 混為一談:前者是邏輯結構,後者是描述結構的 metadata 集合
- 看到主鍵就假定只能有單一欄位,忽略 composite primary key
換你快速判斷
先在心中作答,再展開答案。答不出來時,回頭找本課的對照關係。
1relation schema 與 relation instance 有何差別?
Schema 是欄位、domain 與限制所構成的邏輯結構;instance 是某一時刻實際存在的 tuples。
Schema 通常較穩定,instance 會隨 INSERT、UPDATE、DELETE 改變。考題問 logical structure 時應答 schema。
2superkey 與 candidate key 的關鍵差異是什麼?
兩者都能唯一識別 tuple;candidate key 還必須具有最小性,移除任何欄位後就不再唯一。
含多餘欄位的唯一集合仍是 superkey,但不是 candidate key。Primary key 是設計者選定的一個 candidate key。
3foreign key 一定不能是 NULL 嗎?
不一定。若欄位沒有 NOT NULL 限制,foreign key 通常可以是 NULL;非 NULL 值則必須對應被參照鍵。
Foreign key 管的是參照完整性,不等於 NOT NULL。Primary key 才必然不可為 NULL。
4entity integrity 與 referential integrity 各限制什麼?
Entity integrity 要求 primary key 唯一且非 NULL;referential integrity 要求外鍵值對應到被參照鍵,或在允許時為 NULL。
前者確保本表每列可識別,後者確保跨表關係不指向不存在的資料。
5database schema 與 data dictionary 是同一件事嗎?
不是。Schema 是資料庫的邏輯結構;data dictionary 是儲存 schema、欄位與限制等 metadata 的目錄。
可以把 schema 想成設計規格,把 data dictionary 想成保存與查詢這份規格的系統表。
6請列舉 DBMS 相較一般檔案系統的三項常見優勢。
集中管理限制以維持完整性、減少冗餘與更新異常、提供有效率且具 data independence 的存取。
另外還有權限、並行控制與故障復原;但 data independence 不代表 schema 可任意改動而不影響程式。
最後用考古題驗證
本課連結的題目都已通過可重現的技術覆核,可逐題練習與判分。
開始本課考古題練習參考來源
- Computer Science: An Overview, 13th Edition — J. Glenn Brookshear
- 資料庫課程 — 陳士杰(杰哥數位教室)