單元 4:數據庫解決方案 —— 綜合學習筆記

歡迎來到精彩的數據庫世界!如果剛開始接觸這個主題時感到有點「技術性」,別擔心。數據庫其實就是電子化的文件櫃,而掌握數據庫是現今資訊科技領域中最有價值的技能之一。

在本章中,我們將學習如何構建、管理和設計強大的數據庫系統,確保數據準確、高效且易於檢索。讓我們開始吧!

1. 理解數據與數據庫結構

1.1 數據(Data)與資訊(Information)

在深入研究數據庫之前,必須先了解原始事實與可用知識之間的區別。

  • 數據 (Data): 指原始、未經處理的事實和數字。數據本身沒有意義。
    例子:90210, J. Smith, 45
  • 資訊 (Information): 經過處理、組織、結構化或在特定情境下呈現的數據,使其具有意義且有用。
    例子:學號為 90210 的學生是 J. Smith,他在考試中獲得 45 分。
1.2 平面檔案數據庫 vs. 關聯式數據庫

數據結構的組織方式決定了系統的高效性和穩定性。

1. 平面檔案數據庫 (Flat File Database)

平面檔案數據庫本質上就是一張大型表格或電子表格,所有數據都儲存在單一結構中。

  • 優點: 設置簡單,適合小型、基礎的需求。
  • 缺點: 極易出現數據冗餘 (data redundancy)(重複儲存相同資訊)和數據不一致 (data inconsistency)(如果更新了一個副本但另一個未更新)。
  • 類比:想像一下,你需要將每位學生的詳細資料(包括完整地址)重複寫在他們收到的每一張成績單上。

2. 關聯式數據庫 (Relational Database, RDB)

關聯式數據庫使用多張通過通用欄位連結的表格(或關係)。這是處理複雜性和擴展性的行業標準。

  • 優點: 減少冗餘,確保數據一致性,靈活且強大。
  • 缺點: 設計和初始設置較為複雜。
  • 類比:與其在每張成績單上重複地址,你只需在「地址表」中儲存一次地址,然後使用唯一的 ID 號碼將成績單連結到該特定地址。
快速回顧:結構
平面檔案 = 一張大表。
關聯式 = 多張連結的表格(更佳!)。

2. 關聯式數據庫的組成要素

讓我們來定義提及表格(或關係)組成部分時所用的關鍵術語。

2.1 實體、屬性、記錄與欄位
  • 實體 (Entity): 現實世界中用於儲存數據的對象、人物、地點或事件。在數據庫術語中,實體成為一張表格 (Table)
    實體例子:學生、課程、教師。
  • 屬性 (Attribute): 實體的特徵或屬性。在數據庫術語中,屬性成為欄位 (Column/Field) 標題。
    學生實體的屬性例子:姓名、出生日期、學號。
  • 記錄 (Record/Tuple): 實體單一例子的完整屬性集合。表格中的一行 (Row)。
    例子:某一位特定學生的完整詳情(姓名、出生日期、學號等)。
  • 欄位 (Field): 記錄與屬性的交集。儲存數據的最小單位。
2.2 理解數據庫鍵值 (Keys)

鍵值非常關鍵!它們是用於唯一識別記錄並在表格之間建立連結的特殊欄位。

1. 主鍵 (Primary Key, PK)

一個(或一組)能唯一識別表格中每一條記錄的欄位。

  • 它對於每條記錄必須是唯一的。
  • 它不能是 Null(空值)。
  • 例子:學號。

2. 外鍵 (Foreign Key, FK)

表格中引用另一張表格主鍵的欄位。外鍵是用於在表格之間創建連結(關係)的機制。

  • 外鍵在其所屬的表格中不一定需要是唯一的。
  • 例子:在「註冊」表中,學號是一個外鍵,它連結回「學生」表的主鍵。

3. 複合鍵 (Composite Key)

兩個或多個屬性組合而成的主鍵。當沒有單一屬性可以唯一識別記錄時,通常需要使用複合鍵。

  • 例子:在記錄考試成績的表中,主鍵可能是(學號 + 課程編號)的組合。單獨使用其中任何一個欄位都不唯一,但兩者組合在一起就是唯一的。
記憶法:鍵值角色
Primary Key = Protector(保護者,唯一識別碼)。
Foreign Key = Follower(追隨者,連結至保護者)。

3. 關係與參照完整性

關係定義了實體如何連接,而完整性規則則確保這些連接保持有效。

3.1 關係類型

關係類型決定了你應將外鍵放在哪裡。

1. 一對一 (1:1)

  • 表 A 中的單一記錄僅與表 B 中的一條記錄相關,反之亦然。
  • 例子:一本護照只發給一個人,而該人也只有一本有效護照。(人 1:1 護照)
  • 實作:外鍵可放在任一表中。

2. 一對多 (1:M)

  • 表 A 中的單一記錄與表 B 中的一條或多條記錄相關。這是最常見的類型。
  • 例子:一個客戶可以下多個訂單。(客戶 1:M 訂單)
  • 實作:外鍵置於「多」的一側(例如:將「客戶編號」放入「訂單」表中)。

3. 多對多 (M:N 或 M:M)

  • 表 A 中的記錄與表 B 中的多條記錄相關,表 B 中的記錄亦與表 A 中的多條記錄相關。
  • 例子:一個學生可以選修多門課程,而一門課程有多名學生。(學生 M:N 課程)
  • 關鍵步驟: M:N 關係無法直接實作。必須使用中間表格(通常稱為聯結表 (Junction Table)連結表)將其拆分為兩個 1:M 關係。
    在上述例子中,連結表就是「註冊」。

如果 M:N 看起來很複雜也不要緊,記住規則即可:M:N 關係中間需要額外一張表格!

3.2 參照完整性 (Referential Integrity)

這是由數據庫管理系統 (DBMS) 設定的一項規則,確保表格之間的關係有效,並防止因刪除或更改數據而意外產生錯誤。

  • 定義: 參照完整性確保外鍵欄位中的每個值,都能在它所參照的主鍵欄位中找到對應的值。
  • 防止的情況:
    • 如果你在「客戶」表(父表)中找不到該客戶編號,你將無法新增「訂單」記錄(子表)。
    • 如果還有與該客戶相關的有效訂單(子記錄),你將無法刪除該客戶(父記錄)。這能防止孤立記錄 (orphan records)(即參照了不存在的父記錄的記錄)。

4. 實現優質設計:正規化 (Normalization)

正規化是一種系統性地組織關聯式數據庫中表格和欄位的過程,旨在最大限度地減少冗餘和依賴,從而建立更穩定、可靠的數據庫。

4.1 正規化解決的問題

如果數據庫未經正規化,會出現冗餘,導致三種異常:

  • 插入異常 (Insertion Anomaly): 除非同時擁有相關數據,否則無法加入新數據。
    例子:在有學生註冊前,無法新增課程。
  • 刪除異常 (Deletion Anomaly): 刪除部分數據時,意外刪除了其他不相關的數據。
    例子:刪除課程中最後一名學生可能會同時刪除關於該課程的所有描述性資訊。
  • 更新異常 (Update Anomaly): 需要在多個地方更新相同資訊,導致不一致風險。
    例子:如果部門名稱儲存了五次,當名稱變更時,必須同時更新所有五個地方。
4.2 正規化範式 (1NF, 2NF, 3NF)

對於大多數實際商業應用,我們的目標是達到第三正規化 (3NF)

步驟 1:第一正規化 (1NF)

符合 1NF 的表格必須:

  1. 每個屬性(欄位)包含原子值(單一、不可再分的)。
    例子:將「地址」欄位拆分為「街道」、「城市」和「郵政編碼」。
  2. 沒有重複的數據組
    例子:不要在學生表中設定「課程1」、「課程2」、「課程3」等欄位,而應將課程移動到獨立的連結表中。

步驟 2:第二正規化 (2NF)

符合 2NF 的表格必須:

  1. 已經是 1NF。
  2. 所有非鍵屬性都完全依賴於整個主鍵。(此規則僅適用於使用複合鍵的表格。)

需修復的問題(部分依賴): 如果你有複合鍵 (A+B),而屬性 C 僅依賴於 A(不依賴 B),這就是部分依賴。你必須將 C 移到以 A 為主鍵的獨立表格中。

例子:如果主鍵是(學號課程編號),而「學生姓名」欄位僅依賴於「學號」而非「課程編號」,則「學生姓名」必須移至獨立的「學生」表中。

步驟 3:第三正規化 (3NF)

符合 3NF 的表格必須:

  1. 已經是 2NF。
  2. 沒有傳遞依賴 (transitive dependencies)

需修復的問題(傳遞依賴): 非鍵屬性依賴於另一個非鍵屬性。如果 A 決定 B,而 B 決定 C,那麼 C 就傳遞依賴於 A。

例子:在「學生」表中,假設有(學號、城市、城市郵遞區號)。「學號」決定「城市」,而「城市」決定「城市郵遞區號」。由於「郵遞區號」依賴於「城市」(另一個非鍵欄位),這種依賴必須移至獨立的「郵遞區號」表中。

重點總結:正規化
1NF:原子值,無重複組。
2NF:必須是 1NF + 無部分依賴(僅適用於複合鍵)。
3NF:必須是 2NF + 無傳遞依賴。

5. 數據庫管理系統 (DBMS)

5.1 什麼是 DBMS?

數據庫管理系統 (DBMS) 是一個軟體套件,允許用戶和其他應用程式與數據庫互動。它處理數據的儲存、組織、檢索和安全性。

  • 常見的 DBMS 例子:Microsoft Access, MySQL, Oracle, SQL Server。
5.2 DBMS 的關鍵功能

DBMS 扮演多個重要角色,作為用戶/應用程式與原始數據檔案之間的橋樑。

  • 數據定義: 定義數據庫的結構(模式/Schema),包括建立表格、設定欄位數據類型(如文字、整數、日期)和定義鍵值。
  • 數據操作: 允許用戶新增、修改、刪除和檢索數據(使用 SQL 等語言)。
  • 數據安全與完整性: 強制執行規則(如參照完整性)、管理用戶存取權限並確保數據一致性。
  • 數據字典(元數據管理): 儲存關於數據本身的資訊(如欄位名稱、數據類型、約束和描述)。
  • 數據備份與復原: 提供儲存數據庫結構和數據的工具,並在故障時進行還原。
5.3 SQL 的角色

與關聯式 DBMS 溝通的主要語言是結構化查詢語言 (Structured Query Language, SQL)

  • SQL 用途: 用於管理和查詢數據庫中的數據。
  • DDL (數據定義語言): 用於定義數據庫結構(如 CREATE TABLE, DROP TABLE)。
  • DML (數據操作語言): 用於管理結構內的數據(如 INSERT, UPDATE, DELETE, SELECT)。

你知道嗎?即使是像 Instagram 或 Amazon 這樣複雜的應用程式,也非常依賴強大的關聯式數據庫(或類似的 NoSQL 結構)來處理數十億的數據,以確保快速的檢索速度。

現在你已經掌握了設計和構建關聯式數據庫的基本概念。這些知識是建立安全、高效資訊系統的基石!