歡迎來到關聯式資料庫的世界!
你有沒有想過 Amazon 是如何記住你的過往訂單,或者你的學校是如何在不混亂的情況下,管理成千上萬名學生、成績以及老師的資料?其中的秘訣就是關聯式資料庫(Relational Database)。
在本章中,我們將學習如何組織數據,使其保持準確、易於搜尋,並儘可能節省儲存空間。如果一開始覺得內容有點「硬核」也別擔心——我們會把它拆解成簡單的小步驟,讓你輕鬆掌握!
1. 什麼是關聯式資料庫?
你可以把關聯式資料庫想像成一套相互連接的數位檔案櫃(稱為資料表 Tables)。與其把每一項資訊都塞進一個巨大、混亂的試算表裡,我們將其拆分成較小且井然有序的資料表。
你需要知道的關鍵術語:
- 關聯 (Relation): 這是資料表 (Table) 的正式名稱。
- 屬性 (Attribute): 欄位標題。例如:學生姓名 (StudentName) 或 出生日期 (DateOfBirth)。
- 元組 (Tuple): 這是記錄 (Record) 的專業術語(資料表中的單一列)。
- 定義域 (Domain): 屬性允許值的集合(例如:「年級」的定義域可能是 1 到 10)。
類比: 想像一所學校。我們有一個學生資料表,另一個是課程資料表。我們將它們「關聯」起來,這樣就能知道哪個學生選了哪門課,而不需要重複輸入五次學生的地址!
快速回顧:
關聯式資料庫透過連結多個資料表來減少冗餘 (Redundancy)(即重複輸入相同的數據)。
2. 鍵值 (Keys):資料庫的「身分證」
為了將不同的資料表連結起來,我們需要稱為鍵值 (Keys) 的特殊欄位。
主鍵 (Primary Key)
主鍵是資料表中每一筆記錄的唯一識別碼。資料表中沒有兩列可以擁有相同的主鍵。
例子:你的學生編號或汽車的車牌號碼。
外鍵 (Foreign Key)
外鍵是指一個資料表中的主鍵,它出現在另一個資料表中,用來將兩者連結起來。
複合鍵 (Composite Key)
有時,單一欄位不足以成為唯一識別碼。複合鍵是由兩個或多個欄位組合而成的特殊主鍵。
記憶小撇步:
Primary(主鍵) = Personal(個人的,是我獨有的 ID)。
Foreign(外鍵) = Friend(朋友的,是來自另一個資料表的朋友 ID)。
3. 實體關係 (ER) 模型
在建立資料庫之前,我們會繪製一張圖表,稱為實體關係圖 (Entity-Relationship Diagram, ERD)。實體 (Entity) 就是我們想要儲存數據的「事物」(例如:學生、老師或書籍)。
關係類型:
- 一對一 (1:1): 一個丈夫擁有一位妻子(通常情況下!)。
- 一對多 (1:M): 一位母親可以有多個孩子。這是最常見的類型。
- 多對多 (M:M): 許多學生修讀許多科目。注意:資料庫非常討厭「多對多」關係;我們通常會將其拆解成更小的資料表!
你知道嗎? 在 ER 圖中,我們常使用「烏鴉腳 (Crow's Foot)」標記法。帶有三個小「腳趾」的一端代表關係中的「多」方!
4. 正規化 (Normalisation):清理混亂
正規化是組織數據的過程,目的是減少冗餘(重複)並提升資料完整性 (Data Integrity)(準確性)。我們分為三個階段來執行。
第一正規化 (1NF)
當滿足以下條件時,資料表即達到 1NF:
1. 沒有「重複的屬性組」。
2. 所有資料格都是原子的 (Atomic)(這意味著你無法再拆分這些數據)。
例子:你不應該在一個格子裡寫「足球, 西洋棋」。它們應該分開在不同的列中。
第二正規化 (2NF)
當滿足以下條件時,資料表即達到 2NF:
1. 已經符合 1NF。
2. 沒有部分函數依賴 (Partial Dependencies)。這意味著每個非鍵屬性都必須完全依賴於整個主鍵(僅當你有複合鍵時才需要考慮)。
第三正規化 (3NF)
當滿足以下條件時,資料表即達到 3NF:
1. 已經符合 2NF。
2. 沒有傳遞函數依賴 (Transitive Dependencies)。
黃金法則: 每個屬性都必須依賴於「鍵值、整個鍵值,且除此以外無其他!」
常見錯誤: 學生常忘記 3NF 的前提是資料表必須先達到 2NF。這就像爬梯子一樣——你不可能不經過前兩階就直接到達第三階!
5. 結構化查詢語言 (SQL)
SQL 是我們與資料庫溝通的語言。它讓我們能夠搜尋、新增或刪除數據。
四大指令:
- SELECT: 你想看到哪些欄位?
- FROM: 你要搜尋哪個資料表?
- WHERE: 搜尋條件是什麼?(就像濾網一樣)。
- ORDER BY: 你想按字母或數字順序排列結果嗎?
SQL 查詢範例:
找出所有得分高於 80 分的學生姓名:
SELECT StudentName
FROM StudentTable
WHERE TestScore > 80
ORDER BY StudentName ASC
小撇步: 如果你想選取資料表中的所有欄位,請使用星號 *。
\(SELECT * FROM Students\)
總結檢查清單
你能向朋友解釋這些概念嗎?
- 元組 (Tuple) 和 屬性 (Attribute) 之間的區別。
- 為什麼主鍵 (Primary Key) 必須是唯一的。
- 外鍵 (Foreign Key) 如何連結兩個資料表。
- 正規化 (Normalisation) 的三個階段。
- 如何編寫基本的 SELECT 語句。
做得好!資料庫可能會比較棘手,因為它需要非常有組織的思考方式,但一旦你掌握了「鍵值」和「正規化」,剩下的就只是簡單的邏輯了。繼續練習那些 SQL 查詢吧!