DBMS - 資料庫正規化
你好,有志於數據庫的熱心同好們!今天,我們將踏上一段刺激的旅程,探索數據庫正規化的世界。作為你們親切友善的計算機科學老師,我很興奮能夠引導你們了解這個數據庫設計中的關鍵概念。別擔心如果你是編程新手——我們會從基礎開始,逐步深入!
資料庫正規化介紹
想像你正在整理衣櫥。你會把所有的衣服隨便丟進一個大堆嗎?當然不會!你會按照類型、顏色或季節來整理它們。數據庫正規化非常類似——它關於有效地組織數據並減少冗余。
函數相依性
我們從一個基本概念開始:函數相依性。
什麼是函數相依性?
函數相依性(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 的公理。這些是函數相依性的基本規則。把它們想像成數據庫關係的「物理定律」!
- 反身性:如果 Y 是 X 的子集,則 X → Y
- 補充性:如果 X → Y,則 XZ → YZ
- 传递性:如果 X → Y 且 Y → Z,則 X → Z
這些可能聽起來有點複雜,但它們只是描述邏輯關係的正式方式。我們會在後面的內容中看到它們是如何應用的!
權宜的函數相依性
一個權宜的函數相依性是當右手邊的屬性是左手邊的子集時。例如:
Student_ID, Name → Student_ID
這是權宜的,因為知道 Student_ID 和 Name 永遠會告訴你 Student_ID(它已經在那裡了!)。
正規化
現在,讓我們深入我們課程的核心:正規化。正規化是組織數據以減少冗余和相依性的過程。這就像整理你的數據庫!
第一正規形式(1NF)
第一正規形式是正規化的基礎水平。為了達到 1NF:
- 消除重複的群組
- 為每組相關數據創建一個單獨的表
- 使用主鍵標識每組相關數據
我們來看一個例子:
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,我們需要:
- 符合 1NF
- 移除部分相依性
我們來看一個例子:
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,我們需要:
- 符合 2NF
- 移除遞歸相依性
我們來看一個例子:
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:
- 符合 3NF
- 為每個相依性 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