資料庫正規化基礎的描述

注意

Office 365 專業增強版已重新命名為適用于企業的 Microsoft 365 應用程式。 如需此變更的詳細資訊,請閱讀此博客文章

原始 KB 編號:  283878

本文說明初學者的資料庫正常化術語。 在討論關聯式資料庫的設計時,基本瞭解此術語很有説明。

正常化的描述

正規化是在資料庫中組織資料的處理常式。 這包括建立資料表,並根據設計使用的規則來保護資料,以及透過消除冗余和不一致的相依性,使資料庫更具彈性。

冗餘數據會浪費磁碟空間,並產生維護問題。 如果必須變更位於多個位置的資料,則必須在所有位置中以完全相同的方式變更資料。 若將資料儲存在 [Customers] 資料表中,且資料庫中的任何地方,都能讓客戶位址變更變得更容易實施。

「不一致的相依性」為何? 雖然使用者可直觀顯示特定客戶位址的 [客戶] 資料表,但是對該客戶進行通話的員工薪金可能並不有意義。 員工的薪金會與員工相關或視其而定,因此應該移至 [Employees] 資料表。 因為找不到資料可能遺失或損毀,所以不一致的相依性會使資料難於存取。

資料庫正常化有一些規則。 每個規則稱為「一般表單」。 如果觀察到第一個規則,則會將資料庫稱為「第一個一般表單」。 如果觀察到前三個規則,則會將資料庫視為「第三范式」。 雖然可能有其他的標準化層級,但第三個一般表單會被視為大多數應用程式的最高必要層級。

如同許多正規的規則和規格,實際的案例不一定允許完全符合規範。 一般說來,正規化需要其他資料表,有些客戶卻發現這種麻煩。 如果您決定要違背其中一個標準化的前三個規則,請確定您的應用程式會預見任何可能發生的問題,例如多餘的資料和不一致的相依性。

下列說明包含範例。

第一個一般表單

  • 除去個別資料表中的重複群組。
  • 針對每一組相關資料建立個別的資料表。
  • 使用主鍵識別每一組相關資料。

請勿在單一資料表中使用多個欄位來儲存類似的資料。 例如,若要追蹤可能來自兩個可能來源的庫存專案,則庫存記錄可以包含廠商碼1和廠商程式碼2的欄位。

當您新增協力廠商廠商時,會發生什麼事? 新增欄位不是答案;它需要程式和表格修改,而且不會順利容納大量廠商。 相反地,將所有廠商資訊放在另一個名為廠商的資料表中,然後使用專案編號參數將庫存連結至廠商,或使用廠商的程式碼金鑰將其與庫存。

第二一般表單

  • 為套用至多筆記錄的值集建立不同的資料表。
  • 建立這些資料表與外鍵的關聯。

記錄不應該取決於資料表主鍵(必要時為複合索引鍵)以外的任何專案。 例如,在會計系統中考慮客戶的位址。 客戶資料表需要該位址,但同時還會透過訂單、發貨、發票、應付帳款和收款表使用。 在 [Customers] 資料表或個別的 [位址] 表格中,將客戶的位址儲存在一個地方,而不是將其儲存為個別的專案。

第三范式

  • 消除不是取決於機碼的欄位。

不屬於該記錄鍵的記錄中的值不屬於該資料表。 一般說來,只要一組欄位的內容會套用至表格中的一筆記錄,請考慮將這些欄位放在不同的資料表中。

例如,在員工招聘表中,可能會包含候選人的大學名稱和位址。 不過,您需要完整的大學清單以供群組郵寄。 如果院校資訊儲存在候選人表格中,就無法列出沒有目前候選人的大學。 建立個別的大學資料表,並將其連結至具有院校碼碼的候選人表格。

例外狀況:遵循第三一般表單,但理論上很可取,並非一定可行。 如果您有 Customers 資料表,而您想要消除所有可能的 interfield 相依性,您必須為城市、郵遞區號、銷售代表、客戶類別及任何其他可能在多筆記錄中重複的因素建立不同的表格。 在理論中,正規化值得 pursing。 不過,許多小型表格可能會降低效能,也可能會超出開啟的檔案和記憶體容量。

將第三范式套用至經常變更的資料可能更可行。 若某些相依的欄位仍然存在,請將您的應用程式設計為要求使用者在任何人變更時,驗證所有相關的欄位。

其他范式

第四范式(也稱為 Boyce Codd Normal Form (BCNF)和第五個一般表單確實存在,但在實際設計中很少考慮。 不忽略這些規則可能會導致不太完善的資料庫設計,但不會影響功能。

正常化範例表格

下列步驟說明將虛構的學生表格正常化的程式。

  1. 未標準化的資料表:

    學生# 顧問 Adv-會議室 Class1 Class2 Class3
    1022 鐘斯 412 101-07 143-01 159-02
    4123 史密斯 216 201-01 211-02 214-01
  2. 第一范式:沒有重複群組

    表格應該只有兩維。 因為一個學生有數個類別,所以這些類別應該會列在不同的表格中。 在上述記錄中的欄位 Class1、Class2 及 Class3 都是設計問題的指示。

    試算表經常使用第三個維度,但資料表不應該使用。 若要查看這項問題,另一種方法是使用一對多關聯,請勿在同一個表格中放置一個邊和多個邊。 相反地,請清除重複群組(類別 #)以在第一個一般表單中建立另一個資料表,如下所示:

    學生# 顧問 Adv-會議室 類#
    1022 鐘斯 412 101-07
    1022 鐘斯 412 143-01
    1022 鐘斯 412 159-02
    4123 史密斯 216 201-01
    4123 史密斯 216 211-02
    4123 史密斯 216 214-01
  3. 第二范式:消除冗餘數據

    請記下表中每個學生 # 值的多類別 # 值。 類別 # 與學生 # (primary key)並未依作用的方式,所以這個關聯不是在第二個一般表單中。

    下列兩個表格示範第二一般表單:

    學生:

    學生# 顧問 Adv-會議室
    1022 鐘斯 412
    4123 史密斯 216

    註冊:

    學生# 類#
    1022 101-07
    1022 143-01
    1022 159-02
    4123 201-01
    4123 211-02
    4123 214-01
  4. 第三范式:消除不取決於索引鍵的資料

    在最後一個範例中,Adv-會議室(advisor 的辦公室號碼)在功能上取決於 Advisor 屬性。 解決方法是將該屬性從 [學生] 表格移至教職員表格,如下所示:

    學生:

    學生# 顧問
    1022 鐘斯
    4123 史密斯

    教師:

    名稱 房間
    鐘斯 412 42
    史密斯 216 42