DBMS - 資料庫正規化

你好,有志於數據庫的熱心同好們!今天,我們將踏上一段刺激的旅程,探索數據庫正規化的世界。作為你們親切友善的計算機科學老師,我很興奮能夠引導你們了解這個數據庫設計中的關鍵概念。別擔心如果你是編程新手——我們會從基礎開始,逐步深入!

DBMS - Database Normalization

資料庫正規化介紹

想像你正在整理衣櫥。你會把所有的衣服隨便丟進一個大堆嗎?當然不會!你會按照類型、顏色或季節來整理它們。數據庫正規化非常類似——它關於有效地組織數據並減少冗余。

函數相依性

我們從一個基本概念開始:函數相依性。

什麼是函數相依性?

函數相依性(Functional Dependency, FD)是關係中兩個屬性之間的關係,其中一個屬性決定了另一個屬性。

想像你有一個學生數據庫:

Student_ID Name Age Course
101 Alice 20 Math
102 Bob 21 Physics
103 Charlie 19 Chemistry

在這裡,Student_ID 函數性地決定了 Name、Age 和 Course。我們這樣寫:

Student_ID → Name, Age, Course

這意味著如果我們知道 Student_ID,我們可以確定學生的 Name、Age 和 Course。

Armstrong 的公理

現在,讓我們來談談 Armstrong 的公理。這些是函數相依性的基本規則。把它們想像成數據庫關係的「物理定律」!

  1. 反身性:如果 Y 是 X 的子集,則 X → Y
  2. 補充性:如果 X → Y,則 XZ → YZ
  3. 传递性:如果 X → Y 且 Y → Z,則 X → Z

這些可能聽起來有點複雜,但它們只是描述邏輯關係的正式方式。我們會在後面的內容中看到它們是如何應用的!

權宜的函數相依性

一個權宜的函數相依性是當右手邊的屬性是左手邊的子集時。例如:

Student_ID, Name → Student_ID

這是權宜的,因為知道 Student_ID 和 Name 永遠會告訴你 Student_ID(它已經在那裡了!)。

正規化

現在,讓我們深入我們課程的核心:正規化。正規化是組織數據以減少冗余和相依性的過程。這就像整理你的數據庫!

第一正規形式(1NF)

第一正規形式是正規化的基礎水平。為了達到 1NF:

  1. 消除重複的群組
  2. 為每組相關數據創建一個單獨的表
  3. 使用主鍵標識每組相關數據

我們來看一個例子:

1NF 之前:

Order_ID Product Quantity
1 Apple, Banana 2, 3
2 Orange, Grape 1, 4

1NF 之後:

Order_ID Product Quantity
1 Apple 2
1 Banana 3
2 Orange 1
2 Grape 4

看見我們是如何消除了重複群組的?乾淨多了!

第二正規形式(2NF)

為了達到 2NF,我們需要:

  1. 符合 1NF
  2. 移除部分相依性

我們來看一個例子:

Student_ID Course_ID Course_Name Instructor
101 C1 Math Prof. Smith
102 C2 Physics Prof. Johnson

在這裡,Course_Name 和 Instructor 取決於 Course_ID,而不是 Student_ID。我們應該將這個表拆分成兩個表:

表 1: Student_Course

Student_ID Course_ID
101 C1
102 C2

表 2: Course

Course_ID Course_Name Instructor
C1 Math Prof. Smith
C2 Physics Prof. Johnson

第三正規形式(3NF)

為了達到 3NF,我們需要:

  1. 符合 2NF
  2. 移除遞歸相依性

我們來看一個例子:

Employee_ID Department Department_Head
101 Sales John
102 Marketing Sarah

在這裡,Department_Head 取決於 Department,而 Department 又取決於 Employee_ID。我們應該將這個表拆分:

表 1: Employee

Employee_ID Department
101 Sales
102 Marketing

表 2: Department

Department Department_Head
Sales John
Marketing Sarah

Boyce-Codd 正規形式(BCNF)

BCNF 是 3NF 的稍微強化版本。要達到 BCNF:

  1. 符合 3NF
  2. 為每個相依性 X → Y,X 應該是一個超鍵

這裡有一個例子:

Student Subject Professor
Alice Math Prof. Smith
Bob Physics Prof. Johnson

在這個例子中,(Student, Subject) → Professor 和 Professor → Subject。為了達到 BCNF,我們拆分它:

表 1: Student_Professor

Student Professor
Alice Prof. Smith
Bob Prof. Johnson

表 2: Professor_Subject

Professor Subject
Prof. Smith Math
Prof. Johnson Physics

這就是數據庫正規化的基礎。記住,雖然正規化很重要,但有時為了性能原因,反規化也可能很有用。這一切都是關於為你的特定需求找到正確的平衡。

希望這個指南對你有所幫助。記住,熟能生巧!嘗試自己對一些樣本數據庫進行正規化。如果你有任何問題,不要猶豫提問。快樂正規化!

Credits: Image by storyset