電腦科學 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)。
資料庫解決了檔案系統中的冗餘和不一致問題。我們使用實體、記錄、欄位和鍵值(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 語句)翻譯成電腦可以執行的底層操作,以檢索或修改資料。
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 KEY 或 FOREIGN 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;
SQL 是用於管理資料庫的語言。DDL 定義結構 (CREATE, ALTER)。DML 管理資料 (INSERT, UPDATE, DELETE, SELECT)。查詢時,請務必記得使用 WHERE 子句進行篩選,並使用 INNER JOIN 連結相關表格。