本文 AI 產出,尚未審核

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
);

註解INTVARCHARDATE 為常見資料型別,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。透過 enrollmentscourses 表的分離,可解決此問題。


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; -- 失敗時執行

實際應用場景

  1. 學校教務系統

    • 使用 studentscoursesenrollments 三張表管理學生資訊、課程資訊與選課紀錄。透過外鍵確保選課資料不會指向不存在的學生或課程。
  2. 電商平台的訂單管理

    • customersordersorder_itemsproducts 四張表形成典型的 一對多多對多 關係。正規化避免商品價格重複儲存,交易確保訂單與明細同時成功寫入。
  3. 部門人事系統

    • employees 表儲存員工基本資料,departments 表儲存部門資訊,employee_dept 交叉表記錄員工所屬多個部門(例如兼職)。外鍵與 ON DELETE SET NULL 可在部門被刪除時保留員工資料。
  4. 即時分析(Reporting)

    • 為了加速報表產出,通常會建立 資料倉儲(Data Warehouse),將原始正規化資料匯入 星型(Star)或雪花(Snowflake)模型。這裡的概念仍依賴於關聯式資料庫的 表關聯索引

總結

  • 關聯式資料庫 以表、欄位、主鍵、外鍵為核心,透過 正規化 減少資料冗餘,提升一致性與維護性。
  • MySQL 提供完整的 DDL(資料定義語言)DML(資料操作語言),讓開發者能快速建立、查詢與管理資料。
  • 最佳實踐 包括:必設主鍵、為外鍵加索引、適度正規化、使用交易保護資料完整性、選擇正確的資料型別。
  • 了解這些概念後,你就能在 教務系統、電商平台、人事管理 等各種實務情境中,設計出既可靠高效的資料庫結構。

掌握關聯式資料庫的基本觀念,是成為 MySQL 專家的第一步。接下來,建議透過實際專案練習 表設計、索引調校與查詢優化,讓理論與實務相結合,持續提升資料庫開發與管理的能力。祝你學習順利!