MySQL 基礎概念 – 關聯式資料庫基本觀念
簡介
在現代資訊系統中,關聯式資料庫(Relational Database) 是最常見的資料儲存方式之一。無論是網站、行動應用,或是企業內部系統,都離不開資料庫的支援。對於學習 MySQL 的同學而言,先掌握關聯式資料庫的核心概念,才能在後續的表設計、查詢優化與交易處理上得心應手。
本篇文章將從 資料表、欄位、主鍵、外鍵 等基本要素說起,並搭配實作範例說明如何在 MySQL 中建立與操作資料。內容以淺顯易懂的語言呈現,適合 初學者 及 中級開發者 快速入門與鞏固概念。
核心概念
1. 資料表(Table)與欄位(Column)
資料表是關聯式資料庫的最小單位,類似 Excel 工作表。每一筆資料稱為 列(row),每個欄位則定義了資料的類型與限制。
-- 建立一個「students」資料表,包含學號、姓名與生日欄位
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 主鍵,唯一且不允許 NULL
name VARCHAR(50) NOT NULL, -- 姓名,必填
birth_date DATE -- 生日,可為 NULL
);
註解:
INT、VARCHAR、DATE為常見資料型別,PRIMARY KEY表示此欄位為唯一識別碼。
2. 主鍵(Primary Key)與唯一鍵(Unique Key)
- 主鍵:保證每筆資料唯一,且自動建立索引,提升查詢效能。每個資料表只能有一個主鍵。
- 唯一鍵:同樣保證唯一性,但允許有多個且可接受
NULL(視資料庫設定而定)。
-- 在「courses」表中,同時使用主鍵與唯一鍵
CREATE TABLE courses (
course_id CHAR(6) PRIMARY KEY, -- 例如 CS101
course_name VARCHAR(100) NOT NULL,
course_code VARCHAR(10) UNIQUE -- 不能重複的課程代碼
);
3. 外鍵(Foreign Key)與參照完整性(Referential Integrity)
外鍵用來 建立表與表之間的關聯,確保資料的一致性。例如,學生選課的紀錄必須對應到已存在的學生與課程。
-- 建立「enrollments」表,記錄學生選課情況
CREATE TABLE enrollments (
enrollment_id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id CHAR(6),
enroll_date DATETIME DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_student
FOREIGN KEY (student_id) REFERENCES students(student_id)
ON DELETE CASCADE, -- 刪除學生時,同步刪除選課紀錄
CONSTRAINT fk_course
FOREIGN KEY (course_id) REFERENCES courses(course_id)
ON UPDATE RESTRICT -- 課程代碼變更時,阻止更新
);
說明:
ON DELETE CASCADE讓外鍵關聯的資料在父表被刪除時自動刪除,避免孤兒資料(orphan record)。
4. 正規化(Normalization)與資料冗餘
正規化是將資料拆分成多個相關表,以減少 資料重複、提升 更新一致性。常見的正規形態包括 第一正規形(1NF)、第二正規形(2NF)、第三正規形(3NF)。
- 1NF:每個欄位只能儲存原子值(不可再分)。
- 2NF:在 1NF 基礎上,所有非鍵欄位必須完全依賴於主鍵。
- 3NF:在 2NF 基礎上,非鍵欄位不應該相互依賴。
範例:若在
students表中直接加入course_name,會造成同一課程名稱在多筆學生資料中重複,違反 3NF。透過enrollments與courses表的分離,可解決此問題。
5. 基本查詢(SELECT)與 JOIN
關聯式資料庫的威力在於 跨表查詢。以下示範如何透過 JOIN 取得學生姓名與所選課程名稱。
-- 取得每位學生的選課清單
SELECT
s.name AS student_name,
c.course_name AS course_name,
e.enroll_date
FROM enrollments e
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id
ORDER BY e.enroll_date DESC;
技巧:使用
AS給欄位重新命名,可提升結果的可讀性;ORDER BY讓結果依時間排序。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 最佳實踐 |
|---|---|---|
| 忘記設定主鍵 | 資料表若無主鍵,會導致重複資料與效能下降。 | 每張表必須設計 唯一且不可變 的主鍵(如自增 ID 或自然鍵)。 |
| 外鍵未加索引 | 外鍵關聯查詢會全表掃描,效能極差。 | 為外鍵欄位 手動建立索引(MySQL 5.6+ 會自動建立,但仍建議確認)。 |
| 過度正規化 | 拆得太細會產生大量 JOIN,影響查詢速度。 |
根據實務需求在 3NF 與性能 之間取得平衡,必要時使用 反正規化(冗餘欄位)。 |
| 忽略交易(Transaction) | 多表寫入時若其中一筆失敗,會留下不一致資料。 | 使用 START TRANSACTION … COMMIT/ROLLBACK 包裹相關操作。 |
| 使用不恰當的資料型別 | 例如把電話號碼存成 INT,會失去前導零。 |
依據實際需求選擇最合適的型別,如 VARCHAR(20) 或 CHAR。 |
範例:使用交易確保資料一致性
START TRANSACTION;
INSERT INTO students (student_id, name, birth_date)
VALUES (1001, '王小明', '2002-05-12');
INSERT INTO enrollments (student_id, course_id)
VALUES (1001, 'CS101');
-- 若任一 INSERT 失敗,回滾所有變更
COMMIT; -- 成功則提交
-- ROLLBACK; -- 失敗時執行
實際應用場景
學校教務系統
- 使用
students、courses、enrollments三張表管理學生資訊、課程資訊與選課紀錄。透過外鍵確保選課資料不會指向不存在的學生或課程。
- 使用
電商平台的訂單管理
customers、orders、order_items、products四張表形成典型的 一對多 與 多對多 關係。正規化避免商品價格重複儲存,交易確保訂單與明細同時成功寫入。
部門人事系統
employees表儲存員工基本資料,departments表儲存部門資訊,employee_dept交叉表記錄員工所屬多個部門(例如兼職)。外鍵與ON DELETE SET NULL可在部門被刪除時保留員工資料。
即時分析(Reporting)
- 為了加速報表產出,通常會建立 資料倉儲(Data Warehouse),將原始正規化資料匯入 星型(Star)或雪花(Snowflake)模型。這裡的概念仍依賴於關聯式資料庫的 表關聯 與 索引。
總結
- 關聯式資料庫 以表、欄位、主鍵、外鍵為核心,透過 正規化 減少資料冗餘,提升一致性與維護性。
- MySQL 提供完整的 DDL(資料定義語言) 與 DML(資料操作語言),讓開發者能快速建立、查詢與管理資料。
- 最佳實踐 包括:必設主鍵、為外鍵加索引、適度正規化、使用交易保護資料完整性、選擇正確的資料型別。
- 了解這些概念後,你就能在 教務系統、電商平台、人事管理 等各種實務情境中,設計出既可靠又高效的資料庫結構。
掌握關聯式資料庫的基本觀念,是成為 MySQL 專家的第一步。接下來,建議透過實際專案練習 表設計、索引調校與查詢優化,讓理論與實務相結合,持續提升資料庫開發與管理的能力。祝你學習順利!