關聯式資料庫入門:掌握資料庫正規化過程與資料庫串接的方式
在
上一篇文章我們認識了關聯式資料庫以及資料庫的重要性,接下來本篇內容我們要來認識關聯式資料庫正規化與資料庫串接的方式。
關聯式資料庫的正規化
正規化是一種資料庫設計技術,在關聯式資料庫設計中扮演著非常關鍵的角色,透過將資料分解成多個相關的資料表,並建立適當關聯,減少資料冗餘和提高資料完整性。例如,當我們使用excel的概念,以單一資料表格維謢學生修課記錄,在這個資料表格中,每個學生的個人課程可能會重複多次(因為一個學生可能選修多門課程)。而透過正規化,我們可以將學生資料和課程資料分解為兩個獨立的資料表,透過學生的ID識別碼和課程ID識別碼來建立關聯,進而減少重複資料以及確保資料的一致性。然而過度的正規化反而會造成查詢資料時效能不佳,因此有必要掌握正規化原理。
假設有一個學務系統的資料庫,其中包含一個未經正規化的「學生」資料表,我們將進行正規化。
學生ID |
學生姓名 |
課程 |
課程教師 |
001 |
王小明 |
SQL SERVER資料庫 |
楊老師 |
002 |
李大強 |
ASP.NET MVC |
陳老師 |
003 |
陳大牌 |
C#程式設計 |
陳老師 |
001 |
王小明 |
ChatGPT |
王老師 |
首先我們先來看看在不進行正規化時,可能造成哪些問題
- 王小明想改名,則由於王小明在系統中有2筆資料,因此需要修改2次,並且有可能2次的姓名文字打錯或不一致。
- 同理,楊老師想改名、修改課程名稱,也會遇到與學生改名相同的情況,而造成資料不一致性。
- 相同的資料重覆儲存,浪費空間,例如學生資料會因為修了多門課,而造成重覆儲存。
以上這些問題都得以透過正規化的手段來做好關聯式資料庫的設計。
資料庫正規化步驟
第一階段正規化(1NF)
確保資料表中的每個欄位都是只有一個資料的,即欄位值不能再分解成更小的部分,並且確保每一筆都是唯一的。避免在單一欄位中儲存多個值,這樣可以去除資料冗餘,確保資料的一致性。
學生ID |
學生姓名 |
001 |
王小明 |
002 |
李大強 |
003 |
陳大牌 |
課程ID |
課程 |
課程教師 |
C001 |
SQL SERVER資料庫 |
楊老師 |
C002 |
ASP.NET MVC |
陳老師 |
C003 |
C#程式設計 |
陳老師 |
C004 |
ChatGPT |
王老師 |
學生ID |
課程ID |
001 |
C001 |
001 |
C002 |
002 |
C004 |
003 |
C002 |
003 |
C004 |
第二階段正規化(2NF)
確保每個資料表中的非主鍵欄位都依賴於整個主鍵。在我們的例子中,第一階段正規化後的資料表同時也已經滿足了第二階段正規化的要求。例如:[學生姓名]依賴於[學生ID識別碼],而[課程]及[課程教師]與[學生ID識別碼]無關,而是其依賴於[課程ID識別碼],因此額外產生了另一張資料表(課程資料表)。而學生與修課記錄則是以二者的識別碼額外產生了另一張資料表進行記錄。進一步減少資料冗餘和更新異常。這階段的正規化確保所有非主鍵欄位只依賴於主鍵,而不是依賴於其他非主鍵欄位。
第三階段正規化(3NF)
非主鍵欄位不依賴於其他非主鍵欄位。在我們的例子中,第二階段正規化後,在課程資料表中具有課程[教師姓名],而課程教師姓名與課程資料表並不是直接相關性,因此課程資料表再次調整。
課程ID |
課程 |
C001 |
SQL SERVER資料庫 |
C002 |
ASP.NET MVC |
C003 |
C#程式設計 |
C004 |
ChatGPT |
老師ID |
老師姓名 |
T001 |
楊老師 |
T002 |
陳老師 |
T003 |
王老師 |
課程ID |
老師ID |
C001 |
T001 |
C002 |
T002 |
C003 |
T003 |
C004 |
T002 |
正規化的每一階段都對關聯式資料庫設計有其特定的貢獻,主要在於減少資料冗餘、避免資料異常並提升資料完整性。然而,過度正規化也可能導致效能問題和操作複雜性。因此,合適的正規化程度應根據具體應用場景來決定。
資料關聯的關係:1對1(One-to-One)與1對多(One-to-Many)
在資料庫設計中,1對1(One-to-One)和1對多(One-to-Many)的關係是兩種常見的設計。讓我們延用上面的學校資料庫範例來進行具體說明。
1對1(One-to-One)關係
假設我們在學校資料庫中有一個「學生」表格和一個「帳號資料」資料格,每個學生(「學生」表中的記錄)都有一個唯一的帳號資料:
學生ID |
學生姓名 |
001 |
王小明 |
002 |
李大強 |
003 |
陳大牌 |
學生ID |
帳號 |
001 |
ian |
002 |
andy |
003 |
candy |
1對多(One-to-Many)關係
1對多關係指的是一個資料表中的記錄可以與另一個表中的多個記錄相關聯。例如1筆學生資料可以與修課記錄串接,而學生可能選修多門課程,因此就會形成了1對多的關係。相同的概念還有像是「訂單」及「訂單明細記錄」的關係。
連續2篇資料庫文章,我們已經了解資料庫的關鍵概念,包括資料庫、資料表、欄位,以及資料表之間的關係,如1對1和1對多關聯,還有實際演練了正規化的過程。這些知識不僅是理解關聯式資料庫的基礎,更是進入更高層次的資料管理和分析領域的門檻,精確的資料庫設計和管理對於支撐起強大的資訊系統至關重要。隨著技術的不斷進步,資料庫的角色日益突顯,成為了商業智能、人工智慧和大數據分析不可或缺的一環。希望這些基礎知識能夠激發你對進一步學習資料庫和探索其應用的興趣。
陳葵懋 老師
巨匠電腦 - 程式設計、資料庫、雲端及人工智慧講師
專長:微軟.NET、Azure雲端、MS SQL資料庫,並連續12年獲選微軟最有價值技術專家。
免費學習資源不漏接