數據庫設計方法學:創建出色數據庫的藍圖!

各位同學好!歡迎來到數據庫設計的世界。想像一下,你就像一個建築師,只不過你設計的不是建築物,而是組織有序的系統來儲存資訊。一個好的設計至關重要!它能確保你的數據可靠、高效且易於使用。糟糕的設計?那就好比建了一間沒有門的屋子——一團糟!

在這一章,我們將學習如何從零開始規劃和構建數據庫。我們會涵蓋如何繪製數據藍圖(稱為實體關係圖,簡稱ER圖)、如何整齊地組織數據(透過規範化過程),以及如何確保數據安全。唔使擔心聽落好複雜,我們會一步一步透過簡單例子拆解。準備好,一齊嚟學嘢啦!


藍圖:實體關係圖 (ER圖)

在建造任何東西之前,你都需要一個計劃。在數據庫設計中,我們的計劃就是實體關係圖 (ERD或ER圖)。它是一種視覺化方式,展示我們需要儲存哪些數據,以及不同數據片段之間如何互相連接。

ER圖的構建基石

ER圖有幾個關鍵組成部分。一齊嚟認識一下符號!

  • 實體 (Entity):我們想儲存資訊的人、地方、物件或概念。把它想成名詞。例子:學生 (Student)、書本 (Book)、課程 (Course)。

  • 屬性 (Attribute):實體的性質或特徵。例子:一個學生有「學生姓名」,一本書有「書名」。

  • 鍵屬性 (Key Attribute):能唯一識別一個實體的屬性。這將成為主鍵 (Primary Key)。沒有兩個實體可以在此屬性上擁有相同的值。例子:學生編號 (Student ID)。

  • 關係 (Relationship):兩個或多個實體之間的連接方式。把它想成動詞。例子:一個學生借閱 (borrows) 一本書。

ER圖符號速查表

這些是考試中你必須知道的官方符號。請務必正確使用它們!

實體:一個長方形

屬性:一個橢圓形

鍵屬性:一個橢圓形,名稱帶有底線

關係:一個菱形


事物如何連接:關係的類型

ER圖中連接實體的線段,告訴我們關係的類型,這也稱為基數 (cardinality)。它描述了一個實體的多少個實例可以與另一個實體的實例相關聯。

1. 一對一 (1:1) 關係

實體A的一個實例僅連接到實體B的一個實例。

例子:在一所學校裏,一個校長負責一所學校

2. 一對多 (1:M) 關係

實體A的一個實例可以連接到實體B的多個實例,但實體B的每個實例只連接到實體A的一個實例。

例子:一位老師可以在一個班級裏教導多位學生

3. 多對多 (M:N) 關係

實體A的多個實例可以連接到實體B的多個實例,反之亦然。

例子:許多學生可以選修許多不同的課程。一個學生可以修讀多個課程,而一個課程也可以有多個學生選修。


那些小線和圓圈又代表甚麼呢?參與限制

有時你會在連接到關係菱形的線段上看到額外的符號。這些符號告訴我們該關係是強制性還是可選性。

  • 強制參與 ( | ):實體必須參與該關係。這就像在說:「每個學生都必須修讀至少一門課程。」

  • 可選參與 ( O ):實體不必參與該關係。這就像在說:「一位教授可以受僱於大學,但他可能正在休研究假,目前沒有教授任何課程。」


重點回顧:關係

關係定義了數據如何互動的規則。正確地掌握基數 (1:1, 1:M, M:N) 是數據庫設計中最重要的步驟之一!


創建ER圖:逐步指南

讓我們先為學校圖書館設計一個簡單的數據庫。場景是:「學生可以借閱多本書籍,而一本書也可以在不同時間被多個學生借閱。」

步驟1:識別實體 (名詞)

主要事物是學生 (Student)書本 (Book)

步驟2:識別每個實體的屬性

  • 對於學生 (Student)學生編號 (StudentID)、學生姓名 (StudentName)、班級 (Class)

  • 對於書本 (Book)書本編號 (BookID)、書名 (Title)、作者 (Author)

步驟3:識別主鍵

學生編號 (StudentID)唯一識別每個學生。書本編號 (BookID)唯一識別每本書。讓我們把它們劃上底線。

步驟4:確定關係 (動詞)

學生借閱書本。所以,關係是借閱 (Borrows)

步驟5:確定基數

  • 一個學生可以借閱多本書嗎?可以。

  • 一本書可以被多個學生借閱嗎?可以 (隨著時間推移)。

這是一個典型的多對多 (M:N) 關係。

步驟6:繪圖!

你會繪製一個長方形代表「學生」,另一個代表「書本」,然後在中間繪製一個菱形代表「借閱」,並用線段連接它們。在實體周圍添加橢圓形代表屬性。最後,用「M」和「N」標記關係線。


重點回顧:繪製ER圖

遵循這些步驟:實體 (E) -> 屬性 (A) -> 主鍵 (P) -> 關係 (R) -> 基數 (C) (簡稱EAP-RC)。這個過程能將一個現實世界的問題轉化為清晰的數據庫計劃。


清理混亂:數據冗餘和規範化

想像一下,你在教科書的每一頁都寫上你的完整地址。這會浪費空間,如果你搬家,你就必須更新每一頁!這個問題就稱為數據冗餘 (data redundancy)

數據冗餘是數據庫中不必要的數據重複。這很糟糕,因為它可能導致:

  • 更新異常 (Update Anomaly):如果你在一個地方更改數據,你可能會忘記在所有地方都更改它。
  • 插入異常 (Insertion Anomaly):除非另一部分信息已經存在,否則你無法添加新信息。
  • 刪除異常 (Deletion Anomaly):刪除一部分數據可能會意外刪除其他不相關的數據。

我們用來解決這個問題並減少冗餘的過程稱為規範化 (Normalisation)。把它想像成整理一個非常混亂的房間,把所有東西都放回正確的抽屜裡。

規範化有幾個層次,或稱「規範形式」,但對於香港中學文憑考試 (HKDSE),你需要知道前三個。

第一規範形式 (1NF):每個單元格只有一個值

規則:如果表格的每個單元格都包含單一、原子性 (不可再分割) 的值,並且沒有重複的組,則該表格處於1NF。

不良例子 (非1NF):

一個學生在一個單元格中有多個電話號碼。

如何修正:為每個電話號碼創建一個獨立的行,重複學生的信息。

第二規範形式 (2NF):沒有部分依賴

規則:表格必須處於1NF,並且每個非鍵屬性都必須依賴於整個主鍵。此規則僅在你有複合主鍵 (composite primary key) (由兩個或更多欄位組成的主鍵) 時才重要。

部分依賴 (Partial Dependency):這是指非鍵屬性只依賴於複合主鍵的一部分。

如何修正:如果你發現部分依賴,則拆分該表格。將部分依賴的欄位,連同它們所依賴的主鍵部分,移到一個新表格中。

第三規範形式 (3NF):沒有傳遞依賴

規則:表格必須處於2NF,並且沒有傳遞依賴 (transitive dependencies)

傳遞依賴:這是指一個非鍵屬性依賴於另一個非鍵屬性,而不是直接依賴於主鍵。(想像:A -> B -> C。C依賴於B,而B依賴於A。關鍵是A)。

例子:一個表格有學生編號 (StudentID)、老師姓名 (TeacherName) 和老師辦公室 (TeacherOffice)。老師辦公室 (TeacherOffice) 依賴於老師姓名 (TeacherName),而不是學生編號 (StudentID)。這就是傳遞依賴。

如何修正:再次拆分表格!將傳遞依賴的欄位 (以及它們所依賴的欄位) 移到一個新表格中。


記憶口訣:「鍵,全鍵,唯鍵」
  • 1NF:數據依賴於主鍵。(單一值)
  • 2NF:數據依賴於整條主鍵。(沒有部分依賴)
  • 3NF:數據只依賴於主鍵。(沒有傳遞依賴)

重點回顧:規範化

規範化是創建高效、可靠數據庫的關鍵過程,它能消除數據冗餘和異常。大多數設計良好的數據庫都處於3NF。


回頭看:何時使用反規範化

等等,經過這麼一番整理後,為什麼我們還會想讓它再次混亂呢?有時,擁有太多拆分的表格 (高度規範化) 會導致數據檢索速度變慢。為了生成一個簡單的報告,電腦可能需要連接許多表格,這會花費時間。

反規範化 (Denormalisation) 是指有意地將一些冗餘數據重新添加回數據庫,以提高查詢性能的過程。這是一種權衡:你犧牲了部分數據的「純淨度」以換取速度。這是一種進階技術,通常在速度絕對關鍵時使用。


從藍圖到現實:將ER圖轉換為表格

當你的ER圖完美無瑕且數據結構已經規範化後,就是時候創建實際的數據庫表格了。以下是相關規則:

規則1:映射實體
ER圖中的每個實體都會成為數據庫中的一個表格。實體的名稱會成為表格的名稱。

規則2:映射屬性
每個屬性都會成為該表格中的一個欄位 (column)。鍵屬性會成為主鍵欄位。

規則3:映射關係 (重要部分!)

  • 對於一對多 (1:M) 關係:取「一」方的主鍵,並將其作為新欄位添加到「多」方的表格中。這個新欄位稱為外鍵 (foreign key)。它將兩個表格連結起來。

  • 對於多對多 (M:N) 關係:你無法直接連結它們!你必須創建一個新表格,稱為連結表 (linking table)連接表 (junction table)
    - 這個新表格將包含兩個原始表格的主鍵。這些鍵作為外鍵。
    - 這兩個外鍵通常共同構成連結表的複合主鍵。
    - 這個過程成功地將M:N關係「解決」為兩個1:M關係。


例子:我們的圖書館ER圖

我們的 `Student` (多) -- `Borrows` -- (多) `Book` ER圖將變成三個表格:

1. 學生表格 (Student Table) (學生編號, 學生姓名, 班級)

2. 書本表格 (Book Table) (書本編號, 書名, 作者)

3. 借閱表格 (連結表) (Borrows Table (Linking Table)) (學生編號, 書本編號, 借閱日期)現在,「學生」表格與「借閱」表格之間存在一對多關係,而「書本」表格也與「借閱」表格之間存在一對多關係。問題解決了!


重點回顧:轉換ER圖

將ER圖映射到表格是一個有明確規則的機械化過程。最重要的一條規則是記住如何透過創建連結表來處理多對多 (M:N) 關係。


誰掌握鑰匙?數據私隱與存取權限

數據庫包含有價值的資訊。你肯定不希望一個學生能夠查看或更改另一個學生的成績,對不對?這就是數據私隱發揮作用的地方。

我們透過控制誰可以做什麼來保護數據。這透過存取權限 (access rights) (也稱為許可權) 來管理。

把它想像成辦公大樓裡的門禁卡。CEO的卡可以打開所有門,而實習生的卡可能只能打開主入口和休息室。

在數據庫中,我們可以為不同的用戶授予特定的權限,例如:

  • SELECT (查詢):讀取/查看數據的權限。
  • INSERT (插入):添加新數據的權限。
  • UPDATE (更新):更改現有數據的權限。
  • DELETE (刪除):刪除數據的權限。

透過僅授予用戶完成工作所需的最低權限 (這稱為最小權限原則 (Principle of Least Privilege)),我們可以確保數據的私隱和安全。例如,圖書館前台職員可能對借閱記錄表格擁有 `SELECT` 和 `INSERT` 權限,但他們不會對主要學生資訊表格擁有 `DELETE` 權限。


重點回顧:存取權限

使用存取權限對於保護數據至關重要。它確保只有經授權的人才能查看或修改敏感資訊,這是構建安全可靠系統的核心部分。