電腦科學 9618:學習筆記 - 資料庫 (AS Level)

哈囉,未來的資料庫大師!歡迎來到資料庫章節。無論你是叫外賣、查詢銀行餘額,還是串流影片,你其實都在與資料庫互動。本章的重點在於了解海量數據是如何被組織、保護並高效檢索的。這是幾乎所有現代數位應用的基石!如果術語看起來很陌生,請別擔心;我們會將所有內容拆解成易於消化的部分。


8.1 資料庫概念

基於檔案系統 (File-Based Systems) 的問題

在資料庫普及之前,企業通常使用基於檔案的方法 (file-based approach)來儲存資料——這本質上就是由不同部門管理許多獨立的檔案(就像各自分散的試算表)。
這種方法有嚴重的局限性:

  • 資料冗餘 (Data Redundancy):相同的資料被多次儲存於不同的檔案中。(例如:客戶地址同時儲存在「銷售檔案」和「會計檔案」中。)
  • 資料不一致 (Data Inconsistency):由於資料重複,更新時可能無法同步應用到所有地方,導致資訊矛盾。(例如:銷售檔案顯示舊地址,但會計檔案卻有新地址。)
  • 難以共享:資料散落在各處,不同程式或部門很難同時存取。
  • 缺乏安全性:很難在眾多獨立檔案中應用一致的安全性規則。

關聯式資料庫簡介

關聯式資料庫 (Relational Database)(即我們學習的類型)透過將資料儲存在邏輯連結的結構化表格中,解決了上述基於檔案方法的局限。

核心資料庫術語(資料的語言)

掌握這些術語至關重要,因為它們在考試題目中會交替使用:

  • 實體 (Entity):記錄資料的對象,可以是人、地點、物件、事件或概念。(例如:客戶 CUSTOMER、產品 PRODUCT、訂單 ORDER。)
  • 表格 (Table/Relation):儲存單一實體的資料。它由列(row)和欄(column)組成。
  • 記錄 (Record/Tuple):表格中的單一橫列,包含與該實體的一個實例相關的所有資料。(例如:某個特定客戶的所有資訊。)
  • 欄位 (Field/Attribute):表格中的單一直行,代表該實體的一個特徵或屬性。(例如:客戶姓名 CustomerName、產品價格 ProductPrice。)

記憶小撇步:聯想一下 Excel 試算表:
表格 (Table) = 整個工作表
記錄 (Record) = 一行
欄位 (Field) = 一欄

理解資料庫鍵值 (Keys)

鍵值是高效識別和連結資料的基礎。

  • 主鍵 (Primary Key, PK):能唯一識別表格中每一筆記錄的欄位(或一組欄位)。
    (例如:CUSTOMER 表中的 CustomerID。)
  • 候選鍵 (Candidate Key):任何可能被用作主鍵的欄位(或欄位組合),因為它們能唯一識別記錄。最終只會選擇其中一個作為主鍵。(例如:CustomerID 或 身分證號碼 NationalInsuranceNumber 都可以是候選鍵。)
  • 二級鍵/索引鍵 (Secondary Key/Index Key):主要用於快速搜尋或排序記錄的欄位。它不必是唯一的。(例如:按姓氏 LastName 搜尋 CUSTOMER 表。)
  • 外鍵 (Foreign Key, FK):某個表格中的欄位,它參照了*另一個*表格中的主鍵。這就是建立關聯的方式!(例如:ORDER 表中包含 CustomerID 作為外鍵,以連結回 Customer 表。)
關係與參照完整性 (Referential Integrity)

關係定義了實體之間如何互動:

  • 一對多 (1:M):最常見的類型。表 A 中的一筆記錄對應表 B 中的多筆記錄。(例如:一位客戶 CUSTOMER 可以下多份訂單 ORDERS。)
  • 一對一 (1:1):表 A 中的一筆記錄對應表 B 中的唯一一筆記錄。(較少見,常用於安全性考量或大型表格分割。)
  • 多對多 (M:M):表 A 中的多筆記錄對應表 B 中的多筆記錄。這無法直接在關聯式資料庫中實作;必須使用一個新的中間(連結)表,將其拆解為兩個 1:M 的關係。(例如:多位學生 STUDENTS 可以選修多門課程 COURSES。)

參照完整性 (Referential Integrity):此規則確保表格之間的關係是一致的。它防止你建立一筆連結到不存在記錄的資料(例如:你不能為一個在 CUSTOMER 表中不存在的 CustomerID 建立訂單)。

實體關係圖 (E-R Diagrams)

E-R 圖是設計師用來記錄資料庫結構的視覺化工具,顯示涉及的實體以及它們之間的關係。

  • 實體通常以矩形表示。
  • 關係以連結實體的線條表示,通常會使用特殊的符號(如 Crow’s Foot 或 Chen 標記法)來標示基數 (Cardinality,即 1:M, 1:1)。

正規化 (Normalisation: 1NF, 2NF, 3NF)

正規化是為了有效組織資料庫、減少冗餘並提高資料完整性的過程。它包含一系列稱為正規形式 (Normal Forms, NF) 的步驟。我們重點關注前三個。

第一正規化 (1NF)

若要符合 1NF,表格必須:

1. 不包含重複群組(即單一儲存格中不能有多個值)。
2. 所有屬性(欄位)都包含不可分割的值(原子值)。

步驟:如果學生修了三門課,你不能將所有三門課的代碼列在同一個欄位中。你必須為每一門課建立一筆新記錄,或者將資料拆分到多個表格中。

第二正規化 (2NF)

若要符合 2NF,表格必須:

1. 已經符合 1NF。
2. 所有非主鍵屬性必須完全依賴於整個主鍵。這只有在主鍵是複合鍵(由兩個或多個欄位組成)時才需要考量。

步驟:如果你的主鍵是 (OrderID, ItemNumber),而 ItemName 只依賴於 ItemNumber(主鍵的一部分),你必須將 ItemName 移至獨立的 ITEM 表中。

第三正規化 (3NF)

若要符合 3NF,表格必須:

1. 已經符合 2NF。
2. 沒有遞移依賴 (transitive dependencies)。這意味著非主鍵屬性不能依賴於其他非主鍵屬性。

步驟:在一個表格中,如果 CityName 決定了 PostCode,且 PostCode 不是主鍵,這就是遞移依賴。你必須將 CityName 和 PostCode 移到一個獨立的 POSTCODE 表中。

正規化口訣:
1NF:無重複群組。
2NF:依賴於完整 (W)的主鍵 (W-hole key)。
3NF:除了主鍵外不依賴其他 (No non-key depends on another non-key)。

重點摘要 (8.1)

資料庫解決了檔案系統中的冗餘和不一致問題。我們使用實體、記錄、欄位和鍵值(PK, FK)來結構化資料。正規化 (1NF, 2NF, 3NF) 是一個將表格分解的過程,用以避免資料重複與依賴問題。


8.2 資料庫管理系統 (DBMS)

資料庫管理系統 (Database Management System, DBMS) 是一種作為使用者/應用程式與資料庫資料之間接口的軟體。它負責處理所有複雜的組織、安全和儲存任務。

DBMS 的功能

DBMS 透過提供以下幾項核心功能,解決了基於檔案系統的限制:

  • 資料管理:高效儲存、檢索、更新和管理資料的整體能力。
  • 資料字典 (Data Dictionary/Metadata):儲存資料結構的定義(元數據)。它包含表格名稱、欄位名稱、資料類型、主鍵和關係等資訊。它是資料庫的藍圖。
  • 資料建模與邏輯綱要 (Data Modelling & Logical Schema):提供建立資料庫結構(綱要)的工具,將資料的邏輯組織方式與實體儲存方式分開。
  • 資料完整性:確保資料準確、一致且可靠(例如使用參照完整性規則)。
  • 資料安全性:透過以下方式保護資料:
    • 存取權限:為個人或使用者群組分配特定權限(讀取、寫入、刪除)。
    • 備份程序:提供儲存資料庫副本的機制,以便在發生災難後進行復原。

你知道嗎? 資料完整性至關重要。如果你的資料庫允許價格欄位填入文字或負數,系統將會崩潰或產生不可靠的結果!

DBMS 軟體工具

DBMS 為使用者和開發人員提供多種工具:

  • 開發人員介面:一套工具(通常是圖形化介面),允許開發人員定義表格、設定關係、管理安全性和執行查詢。
  • 查詢處理器 (Query Processor):DBMS 的核心。它將使用者的查詢(如 SQL 語句)翻譯成電腦可以執行的底層操作,以檢索或修改資料。
重點摘要 (8.2)

DBMS 軟體是不可或缺的;它透過資料字典管理資料結構,透過資料完整性強制執行一致性,並透過資料安全性控制存取權限。查詢處理器則是執行你發送給資料庫之指令的引擎。


8.3 資料定義語言 (DDL) 與資料操作語言 (DML)

資料庫任務分為兩大類,均使用業界標準語言:結構化查詢語言 (SQL) 來執行。

DDL (Data Definition Language):用於建立、修改和刪除資料庫的*結構*(空箱子和規則)。

DML (Data Manipulation Language):用於插入、檢索、修改和刪除定義結構內的*實際資料*。

使用 SQL 的資料定義語言 (DDL)

DDL 指令用來構建資料庫的藍圖。

1. 建立資料庫

CREATE DATABASE SchoolRecords;

2. 建立表格(定義結構)

我們必須為每個屬性指定欄位名稱和合適的資料類型

  • CHARACTER:固定長度字串(例如:儲存兩個字母的國家代碼)。
  • VARCHAR(n):長度不固定的字串,最長 'n' 個字元(最常用於姓名、地址)。
  • BOOLEAN:儲存 TRUE 或 FALSE (是/否)。
  • INTEGER:整數(用於 ID、計數器)。
  • REAL:帶有小數點的數值(用於價格、測量值)。
  • DATE:儲存日期。
  • TIME:儲存時間值。

DDL 範例:

CREATE TABLE Student (
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(50) NOT NULL,
IsEnrolled BOOLEAN
);

3. 修改表格結構 (ALTER TABLE)

我們使用 ALTER TABLE 來變更結構,例如新增約束(如主鍵和外鍵)或新增欄位。

新增外鍵:

ALTER TABLE Enrollment
ADD FOREIGN KEY (CourseID) REFERENCES Course (CourseID);

DDL 快速複習

DDL 與結構有關:CREATE 資料庫或表格、ALTER 表格結構、新增 PRIMARY KEYFOREIGN KEY 約束。

使用 SQL 的資料操作語言 (DML)

DML 指令管理儲存在表格中的記錄。

資料維護(新增、更改、刪除記錄)

1. 插入資料 (Adding a Record)

INSERT INTO Student (StudentID, StudentName, IsEnrolled)
VALUES (101, 'Alice Smith', TRUE);

2. 更新資料 (Modifying a Record)

WHERE 子句在此處至關重要,用以鎖定特定記錄。沒有它,你將會更新整個表格!(這是一個常犯的錯誤!)

UPDATE Student
SET IsEnrolled = FALSE
WHERE StudentID = 101;

3. 刪除資料 (Removing a Record)

DELETE FROM Student
WHERE StudentID = 101;

查詢資料 (SELECT 語句)

這是最常見的 DML 任務:檢索資訊。AS Level 僅要求涉及最多兩張表格的查詢。

基本檢索 (SELECT, FROM, WHERE)

SELECT StudentName, StudentID
FROM Student
WHERE IsEnrolled = TRUE;

排序結果 (ORDER BY)

SELECT StudentName
FROM Student
ORDER BY StudentName DESC; -- DESC 代表降序

連結兩張表格 (INNER JOIN)

若要從兩張連結的表格中檢索欄位,我們使用 INNER JOIN。必須指定連結條件(主鍵等於外鍵的地方)。

範例:獲取下特定訂單(訂單 ID 為 50)的學生姓名:

SELECT S.StudentName
FROM Student S INNER JOIN Order O
ON S.StudentID = O.StudentID
WHERE O.OrderID = 50;

分組與聚合 (GROUP BY, SUM, COUNT, AVG)

這些函數用於對一組記錄執行計算:

  • COUNT:計算列數或非空值的數量。
  • SUM:計算數值欄位的總和。
  • AVG:計算數值欄位的平均值。
  • GROUP BY:當使用聚合函數並根據共同欄位值進行摘要時使用。

範例:計算已入學的學生人數(按入學狀態分組):

SELECT IsEnrolled, COUNT(StudentID)
FROM Student
GROUP BY IsEnrolled;

重點摘要 (8.3)

SQL 是用於管理資料庫的語言。DDL 定義結構 (CREATE, ALTER)。DML 管理資料 (INSERT, UPDATE, DELETE, SELECT)。查詢時,請務必記得使用 WHERE 子句進行篩選,並使用 INNER JOIN 連結相關表格。