資料正規化

標準化資料庫的外觀以及表格結構為何重要。

資料正規化是在資料庫中組織資訊的程序,以減少冗餘並提高資料庫效率。將正規化視為確保資料庫中的每個欄位和表格都以邏輯方式組織,以便在插入、更新或刪除記錄時避免資料異常。此程序根據特定的規則執行,這些規則規定了表格應如何組織。

正規化是較大的資料清理和標準化程序的一部分,該程序還包括確認您的資料準確、完整且不包含重複記錄,以及確保您已為欄位選擇了適當的資料類型。如果您從非正規化表格開始,則正規化程序將涉及建立額外的、較小的表格,這些表格可以透過外部索引鍵相互聯結。也許您已經厭倦了在單個值變更後,必須在資料庫中的多個位置更新相同的資訊,或者發現當記錄被刪除時,您正在遺失有價值的資料。正規化您的表格將在這兩種情況下都有所幫助。

我們將在本課程中涵蓋的原則適用於關聯式資料庫管理系統 (RDBMS)。如果您使用的是 NoSQL 或文件型資料庫(如 MongoDB),則以下資訊不適用。

簡化和減少儲存空間:正規化資料的優點

正規化完全是為了提高資料效率,以便您的團隊可以找到並使用他們需要的資訊。一旦您熟悉資料庫的工作方式,這些優點和規則可能看起來像是常識,但了解資料庫中每個表格和欄位的明確目的是值得的。正規化資料的優點包括

  • 簡化交易查詢。使用正規化資料,客戶地址的查詢只需要在儲存這些地址的單個欄位中查找即可。如果您在資料庫中的不同位置多次儲存客戶地址,甚至在同一個欄位中保留多個地址,則該查詢將需要更長的時間才能執行。

  • 減少資料庫的大小。如果您在資料庫中的多個位置重複客戶資料,則表示您已建立空間來多次儲存該資訊。如果您的資料庫僅包含幾個表格,這可能不是主要問題,但如果您正在進行更大規模的工作,磁碟空間可能會很寶貴。減少重複資訊意味著削減儲存成本,無論您是運行本機伺服器還是依賴雲端託管資料庫。

  • 使資料庫維護更容易。想想同一個客戶資料在您的資料庫中儲存了多次。每次客戶變更其地址時,都需要在每個Customer Address欄位的執行個體中更新,這會留下很多錯誤的空間。如果您的資料已正規化,則您只會有一個Customer Address欄位,該欄位會聯結到其他相關表格,例如Orders

資料異常

資料異常是指資訊在資料庫中儲存方式的不一致性。每當記錄更新、新增或刪除時出現問題時,這些資料庫結構的缺陷就會變得明顯。幸運的是,遵守正規化規則可以從一開始就防止這些異常發生。

更新異常

更新異常源於資料冗餘。例如,假設您的資料庫在多個表格的欄位中儲存客戶地址資訊。客戶變更其地址可能會導致僅更新其中一個欄位以包含新資訊,從而導致您的資料不一致。

插入異常

當記錄在沒有包含資料的特定欄位的情況下無法建立時,就會發生插入異常 — 可能尚不存在的資料。例如,非正規化資料庫的結構可能為,除非客戶已下訂單,否則無法建立客戶帳戶。透過建立單獨的OrdersCustomers表格,且沒有規則禁止空值,正規化該資料庫將解決此問題。

刪除異常

意外資訊遺失是刪除異常的結果。假設您資料庫中的表格包含有關大學課程和選修這些課程的學生的資訊。如果某門課程因註冊人數不足而被取消,您可能會因刪除該課程記錄而不慎遺失有價值的學生資訊。與插入異常一樣,將您的資料分解為多個特定的表格將防止此問題發生。

正規化規則

資料正規化的規則最早於 1970 年代初期引入。這些規則分為稱為正規形式的層級。每個層級都建立在最後一個層級之上 — 如果您的資料已經符合第一個層級的規則,您才能應用第二個層級的規則,依此類推。雖然除了下面列出的三個正規形式之外還有幾個正規形式,但前三個正規形式足以應付大多數用例。

正如我們在資料庫簡介中所涵蓋的那樣,資料庫中的表格應包含實體索引鍵,也稱為主要索引鍵。此欄位根據唯一的 ID 區分表格中的每一列,並且在聯結表格時很有用。在我們甚至可以進入第一正規形式之前,您的表格需要具有實體索引鍵欄位。

第一正規形式 (1NF)

第一正規形式 (1NF) 規定表格中的每個欄位應僅儲存一個值,並且您的表格不應包含儲存相似資訊的多個欄位,例如標題為 Address1Address2 的欄。

以下是一個表格範例,我們將根據第一正規形式對其進行正規化。此表格包含有關大學課程以及誰教授這些課程的資訊。

教授表格

教授 ID 教授姓名 課程名稱
P001 Gene Watson 哲學概論;倫理學
P002 Melissa King 量子力學
P003 Errol Tyson 總體經濟學
P004 Mary Jacobson 圖像小說

我們注意到,雖然我們的欄位是不同的,但一位教授(第一列中的 Gene Watson)正在教授兩門課程,並且該資訊目前儲存在單個儲存格中。如果我們根據 1NF 正規化此表格,我們需要將我們的資料分解為多個表格

正規化教授表格

教授 ID 教授姓名
P001 Gene Watson
P002 Melissa King
P003 Errol Tyson
P004 Mary Jacobson

正規化課程表格

課程 ID 課程名稱 教授 ID
C001 哲學概論 P001
C002 倫理學 P001
C003 量子力學 P002
C004 總體經濟學 P003
C005 圖像小說 P004

由於一位教授可以教授多門課程,我們已將此資料分解為兩個表格。現在,我們的Professor表格與我們的Course表格具有一對多關係。此新表格結構符合第一正規形式,並透過外部索引鍵Professor ID欄位聯結這兩個表格。

第二正規形式 (2NF)

第二正規形式是關於減少冗餘並確保每個欄位都描述了實體索引鍵所識別的內容。為了符合 2NF,表格中所有不是實體索引鍵的欄位都必須完全依賴於表格的實體索引鍵(實體索引鍵可能是由兩個欄位組成的複合索引鍵)。讓我們看一個新的範例 — 一個包含有關您員工生日資訊的表格。

員工生日表格

員工 ID 生日 部門
E001 11 月 18 日 會計
E002 3 月 29 日 銷售
E003 6 月 1 日 行銷
E004 2 月 7 日 會計

此表格符合 1NF,因為每個欄都是不同的,並且每個儲存格中僅包含一個值。但是,此表格具有複合索引鍵:Employee ID + Birthday組合構成表格的實體索引鍵。此表格在其目前狀態下不符合 2NF,因為Department欄位僅部分依賴於複合索引鍵,因為員工的部門不依賴於他們的生日,而僅依賴於他們的員工 ID。為了修正此問題,我們將此資訊分解為兩個表格

正規化員工生日表格

員工 ID 生日
E001 11 月 18 日
E002 3 月 29 日
E003 6 月 1 日
E004 2 月 7 日

正規化員工部門表格

員工 ID 部門
E001 會計
E002 銷售
E003 行銷
E004 會計

第三正規形式 (3NF)

如果表格(除了符合 2NF 之外)不包含任何可轉移依賴性,則該表格符合第三正規形式。當欄 A 依賴於欄 B,而欄 B 依賴於實體索引鍵時,就會發生可轉移依賴性。如果您想根據 3NF 進行正規化,您需要從表格中移除欄 A,因為它不直接依賴於實體索引鍵,並將其放置在具有自己實體索引鍵的不同表格中。

訂單表格

訂單 ID 訂單日期 客戶 ID 客戶郵遞區號
R001 01/17/2021 C032 99702
R002 03/01/2021 C004 39204
R003 06/30/2021 C054 06505
R004 08/22/2021 C010 84098
R005 09/27/2021 C004 39204

此表格不符合第三正規形式,因為Customer zip code欄位依賴於Customer ID,而Customer ID不是此表格的實體索引鍵(此處的實體索引鍵是Order ID)。我們目前的結構可能會導致不必要的資訊遺失;如果客戶 C032 退回了他們的訂單,而我們需要刪除此記錄,我們將不慎遺失他們的郵遞區號資訊。如果客戶 C004 曾經搬家且他們的郵遞區號變更了,我們也必須在兩個地方更新它,因為他們下了多個訂單。為了使此表格符合 3NF — 您猜對了 — 我們將其分解為兩個表格。

正規化訂單表格

訂單 ID 訂單日期 客戶 ID
R001 01/17/2021 C032
R002 03/01/2021 C004
R003 06/30/2021 C054
R004 08/22/2021 C010
R005 09/27/2021 C004

正規化客戶表格

客戶 ID 客戶郵遞區號
C032 99702
C004 39204
C054 06505
C010 84098

正規化的缺點:何時取消正規化

一旦您達到較高程度的正規化,您的資料庫在執行某些分析查詢時,速度可能會變慢,特別是那些需要抓取大量資料的查詢。由於正規化的資料需要資料庫存取多個表格才能執行查詢,因此這可能會花費更長的時間,尤其是在您的資料庫複雜性增加時。但好處是,正規化的資料佔用的空間較少。

下一步:資料立方體

以超過兩個維度來思考您的資料。

下一篇文章