單元 4:關聯式資料庫概念學習筆記
你好,未來的 IT 專家!歡迎來到充滿魅力的資料庫世界。本章節是理解現代企業如何管理龐大資訊量的關鍵基礎——從你的學校註冊系統,到 Netflix 和 Amazon 等大型服務皆是如此。如果這些內容看起來很專業,請別擔心;我們會利用簡單的類比來拆解每個概念,確保你能自信地掌握這些核心重點。
這裡的目標不僅是了解什麼是資料庫,還要理解不同資訊片段之間是如何產生「關聯」的——這就是「關聯式」(Relational)名稱的由來!
第 1 節:關聯式資料庫的核心基石
將資料庫想像成一個超級整齊的電子檔案櫃,我們使用特定的結構來高效地儲存資料。
1.1 資料表、記錄與欄位
關聯式資料庫管理系統 (RDBMS) 將資料儲存在稱為資料表 (Tables)(有時稱為關聯,Relations)的二維結構中。
- 資料表 (Table/Relation):這是保存特定類型資訊的主要結構,例如「顧客」或「產品」。(類比:一個專門處理單一主題的電子試算表。)
- 記錄 (Record/Tuple/Row):資料表中的一個完整項目。它包含了某個物件或人員的所有資料。(類比:試算表中的一行,包含該位特定顧客的所有細節。)
- 欄位 (Field/Attribute/Column):資料表內的一個資訊類別。(類比:欄位標題,例如「名字」、「地址」或「訂購日期」。)
給同學的小撇步:
如果你看到一張資料表,請記得:
列 (Rows) = 記錄 (Records)
欄 (Columns) = 類別 (Categories / Fields)
第 2 節:鍵值 (Keys) 的力量
「鍵值」至關重要!它們是特殊的欄位(或欄位組合),用於唯一識別記錄並在資料表之間建立連結。
2.1 主鍵 (Primary Key, PK)
主鍵 (PK) 是資料表中每條記錄的唯一識別碼。
- 它必須是唯一的——沒有兩條記錄可以擁有相同的 PK 值。
- 它不能是 NULL(必須永遠有值)。
- 範例:在「學生」資料表中,學生編號 (Student ID) 通常就是 PK。
記憶法:主鍵 (Primary Key) 就像你的護照號碼 (Passport Key)——它能唯一識別「只有你」這一個人!
2.2 候選鍵 (Candidate Key)
候選鍵是指任何符合唯一性標準,且有潛力作為主鍵的欄位(或欄位組合)。一旦你選定一個候選鍵作為 PK,其餘的候選鍵就會變成替代鍵 (Alternate Keys)。
範例:在「員工」資料表中,「員工編號」和「身分證字號」可能都是唯一的。兩者皆為候選鍵。如果你選擇「員工編號」作為 PK,那麼「身分證字號」就是替代鍵。
2.3 外鍵 (Foreign Key, FK)
外鍵 (FK) 是一個資料表中的欄位,它參照另一個資料表的主鍵。外鍵是建立關聯關係的基本構件。
- 它充當兩個資料表之間的連結或橋樑。
- FK 欄位在其所屬的資料表中不一定要唯一(它經常會重複出現)。
- 它允許我們在不複製資料的情況下查詢詳細資訊。
範例:如果我們有一個「顧客」資料表(以顧客編號作為 PK)和一個「訂單」資料表,「訂單」資料表就會包含顧客編號。在「訂單」資料表中,這個顧客編號欄位就是外鍵。
重點總結: PK 確保資料表內部的唯一性。FK 建立資料表之間的連結。
第 3 節:連接資料 – 關聯 (Relationships)
關聯定義了一個資料表中的記錄如何與另一個資料表中的記錄產生關聯。你必須知道以下三種主要類型:
3.1 一對一 (One-to-One, 1:1)
資料表 A 中的一條記錄對應資料表 B 中的唯一一條記錄,反之亦然。
- 應用場景:這較為少見,通常用於將極度敏感或大量的資料分割到擴充資料表中。
- 範例:一名員工擁有一組唯一的安全存取細節。
3.2 一對多 (One-to-Many, 1:M)
資料表 A 中的一條記錄可以對應資料表 B 中的多條記錄,但資料表 B 中的每條記錄只能對應資料表 A 中的唯一一條記錄。這是最常見的關聯類型。
- 連結方式始終是將「一」側的 PK 放入「多」側作為 FK。
- 範例:一個部門(資料表 A)有多名員工(資料表 B)。部門編號 (PK) 會被放入員工資料表中作為 FK。
3.3 多對多 (Many-to-Many, M:M)
資料表 A 中的一條記錄可以對應多條資料表 B 的記錄,且資料表 B 中的一條記錄也可以對應多條資料表 A 的記錄。
- 範例:多名學生可以報名多門課程。
- 關鍵點: M:M 關聯無法直接在 RDBMS 中實作。
- 解決方案:你必須透過建立第三個資料表(稱為連接表 (Junction Table),或稱連結/中間資料表)來解決 M:M 關聯。
解決 M:M 關聯的步驟:
- 建立一個新的連接表(例如:「選課」)。
- 取得第一個資料表的主鍵(例如:StudentID)。這會成為連接表中的一個 FK。
- 取得第二個資料表的主鍵(例如:CourseID)。這會成為連接表中的一個 FK。
- 連接表的主鍵通常由這兩個外鍵組合而成(稱為複合鍵 (Composite Key))。
現在你有兩個指向連接表的 1:M 關聯,成功解決了 M:M 問題!
重點總結: 1:M 是關聯式設計的核心。M:M 永遠需要連接表。
第 4 節:確保資料品質 – 參照完整性 (Referential Integrity)
參照完整性是一套確保資料表之間關聯一致且有效的規則。簡單來說,它確保你的外鍵永遠指向一個現有的主鍵。
4.1 規則
如果資料表 B 包含參照資料表 A 的外鍵,那麼資料表 B 中的每個外鍵值必須符合資料表 A 的某個主鍵值,或者該外鍵值必須是 NULL(空值)。
4.2 為什麼這很重要?
如果違反參照完整性,你將會得到孤兒記錄 (orphan records)——即連結不到任何地方的資料。(想像一下,如果有一張訂單連結到一個不存在的顧客編號,你將不知道要把發票寄給誰!)
4.3 刪除/更新時的動作
RDBMS 系統提供了一些規則來維護變更時的完整性:
- 限制 (Restrict):如果有對應的 FK 記錄,則禁止刪除或更新該 PK。(最安全的選項)。
- 串聯 (Cascade):如果父表的 PK 被刪除/更新,子表中對應的 FK 記錄也會一併被刪除/更新。(請謹慎使用!)。
- 設為 NULL (Set NULL):如果父表的 PK 被刪除/更新,子記錄中對應的 FK 欄位會被設為 NULL。
你知道嗎?強制執行參照完整性是資料庫自動檢查資料一致性的方式,這能節省大量時間並防止錯誤發生!
第 5 節:效率與組織 – 正規化 (Normalisation)
在進行正規化之前,我們必須了解它能解決哪些問題:
- 資料冗餘 (Data Redundancy):多次儲存相同資料(例如:在每個員工旁邊都儲存完整的部門名稱)。
- 更新異常 (Update Anomalies):如果冗餘資料需要更新,你必須在所有地方更新它。只要漏掉一處,資料就會變得不一致。
- 插入異常 (Insertion Anomalies):在有員工受僱之前,你可能無法插入關於新部門的資料。
- 刪除異常 (Deletion Anomalies):刪除部門中的最後一名員工,會意外刪除關於該部門的所有資訊。
正規化是將關聯式資料庫結構分階段(正規化形式)進行結構化的過程,旨在減少資料冗餘並提高資料完整性。
5.1 第一正規化 (1NF)
如果滿足以下條件,資料表即處於 1NF:
- 擁有主鍵。
- 沒有重複的資料群組(例如:擁有 Item1, Item2, Item3 三個欄位)。
- 所有屬性都是原子的 (atomic)(不可分割)。(範例:「地址」欄位應該拆分為「街道」、「城市」、「郵遞區號」等,而不是存成一大塊。)
規則:一個儲存格應僅包含一個值。
5.2 第二正規化 (2NF)
如果滿足以下條件,資料表即處於 2NF:
- 已經是 1NF。
- 所有非鍵屬性都完全依賴於整個主鍵。
這僅在你擁有複合鍵(由兩個或多個欄位組成的 PK)時才重要。
常見錯誤:如果你有一個複合鍵 (StudentID, CourseID),並儲存了學生姓名。學生姓名只依賴於 StudentID,而不是 StudentID 與 CourseID 的組合。這就是部分依賴 (Partial Dependency)。修正方法是將學生姓名移至獨立的「學生」資料表中。
5.3 第三正規化 (3NF)
如果滿足以下條件,資料表即處於 3NF:
- 已經是 2NF。
- 沒有遞移依賴 (transitive dependencies)。
當一個非鍵屬性依賴於另一個非鍵屬性時,就會存在遞移依賴。
範例:
| PK | 非鍵屬性 | 非鍵屬性 |
|---|---|---|
| 員工編號 | 部門編號 | 部門名稱 |
在這裡,部門名稱依賴於部門編號,而部門編號「不是」PK。這就是遞移依賴。我們透過將這個依賴關係(部門編號、部門名稱)移動到其獨立的「部門」資料表中來修正它。
別慌! 3NF 簡單來說就是:每個非鍵欄位只依賴於主鍵、整個主鍵,且除此之外不依賴任何東西。
重點總結: 正規化是將一張龐大且低效的資料表,拆解為數張更小、高效且彼此連結的資料表的過程。
快速複習箱:關聯式資料庫要點
- RDBMS:管理連結的資料表(關聯)。
- PK:唯一識別碼(不可為 NULL)。
- FK:透過參照另一個資料表的 PK 來連結資料表。
- 1:M:最常見的連結類型。
- M:M:必須使用連接表解決。
- 參照完整性:確保 FK 值符合現有的 PK 值。
- 3NF:良好設計的目標(無冗餘、無遞移依賴)。
你已經掌握了關聯式資料庫的核心概念!回過頭去複習鍵值的角色以及正規化步驟——這些都是你在本單元考試中取得成功的關鍵。