ACC:資料庫正規化基本概念

文章翻譯 文章翻譯
文章編號: 100139 - 檢視此文章適用的產品。
初學者:必須具備單一使用者電腦的使用者介面知識。

全部展開 | 全部摺疊

在此頁中

結論

本文將說明資料庫正規化術語的基本概念。對此術語有基本了解將有助於探討關聯式資料庫的設計。

注意:Microsoft 也提供討論資料庫正規化基本概念的網路廣播。如果要檢視此網路廣播,請造訪下列 Microsoft 網站:
http://support.microsoft.com/servicedesks/webcasts/wc060600/wc060600.asp?fr=1
注意:若要查看 Microsoft Access 2000 的這項資訊,請參閱「Microsoft 知識庫」中的下列文件:
209534 Access 2000 的資料庫正規化基本概念

其他相關資訊

說明

正規化是在資料庫中組織資料的程序。其中包括建立資料表,以及在這些資料表之間根據規則建立關聯性,這些規則的設計目的是透過消除下列這兩個因素,來保護資料並讓資料庫更有彈性:重複性和不一致的相依性。

重複的資料會浪費磁碟空間,並產生維護方面的問題。如果必須變更現有資料,並且該資料的位置超過一個以上,就必須在所有位置上以完全相同的方式進行變更。如果資料只儲存於 [客戶] 資料表中,而不儲存於資料庫中任何其他位置,變更客戶地址就會更容易執行。

何謂「不一致的相依性」?使用者在 [客戶] 資料表中查詢特定客戶的地址,確實是直覺反應,可是在 [客戶] 資料表中尋找拜訪該客戶之員工的薪資,就沒有什麼道理了。員工的薪資與該名員工相關,也就是所謂相依,因此應該移到 [員工] 資料表中。不一致的相依性會讓資料難以存取;尋找資料的路徑可能會遺失或中斷。

資料庫正規化有一些規則。每條規則都稱為「正規形式」。如果遵守第一條規則,資料庫就稱為屬於「第一正規形式」。如果遵守前三條規則,資料庫就被視為屬於「第三正規形式」。雖然可能會有其他層級的正規形式,但第三正規形式被視為大部分應用程式所需的最高階正規形式。

如同有許多正式規則與規格一樣,真實情況不一定永遠完全都相同。一般而言,正規化需要其他資料表,有些客戶也會嫌麻煩。如果您決定違反正規化前三個原則中的其中一個原則,請確定您的應用程式能夠掌握所有可能發生的問題,例如重複的資料與不一致的相依性。

注意:下列說明包括範例。

第一正規形式

  • 刪除各個資料表中的重複群組。
  • 為每一組關聯的資料建立不同的資料表。
  • 使用主索引鍵識別每一組關聯的資料。
不要在單一資料表中使用多重欄位儲存類似的資料。例如,要追蹤來自兩個可能來源的存貨項目,存貨記錄會包含 [廠商代碼 1] 與 [廠商代碼 2] 欄位。

但當您增加第三個廠商時,會發生什麼狀況?增加欄位並不能解決問題,增加欄位需要修改程式與資料表,而且無法順利納入數目不斷變動的廠商。您應該採取另外一種做法,就是將所有廠商資料另外放置在不同的資料表中 (稱為 [廠商]),然後使用項目編號索引鍵,將存貨連結至廠商;或使用廠商代碼索引鍵將廠商連結至存貨。

第二正規形式

  • 為可套用於多筆記錄的多組值建立不同的資料表。
  • 使用外部索引鍵,讓這些資料表產生關聯。
記錄不應依賴資料表主索引鍵之外的索引鍵,但是必要時可使用複合索引鍵。以會計系統中的客戶地址為例。[客戶] 資料表需要地址,但 [訂單]、[送貨]、[發票]、[應收帳款] 與 [已收帳款] 資料表也都需要地址。不要將客戶地址儲存為這些資料表中的不同項目,而是儲存在一個位置,例如儲存在 [客戶] 資料表或另外一個 [地址] 資料表中。

第三正規形式

  • 刪除不依賴索引鍵的欄位。
記錄中的值如果不是該筆記錄之索引鍵的一部分,就不屬於該資料表。一般而言,只要欄位群組的內容可以套用至資料表中一筆以上的記錄時,您就可以考慮將這些欄位放置在不同的資料表中。

例如,在 [員工招募] 資料表中,會包含某位求職者的學院名稱與地址。但是您需要完整的學院清單,以整批寄送郵件。如果學院資訊儲存在 [求職者] 資料表中,就無法列出不含目前求職者的學院清單。因此,您應該要另外建立 [學院] 資料表,然後再使用學院代碼索引鍵連結至 [求職者] 資料表。

例外狀況:既要遵守第三正規形式,又要符合理論,實際上並不是永遠都行得通。如果您有 [客戶] 資料表,並且想要刪除所有可能的欄位間相依性,則必須分別為城市、郵遞區號、銷售人員、客戶類別,以及其他可能會在多筆記錄中重複的因素,建立不同的資料表。理論上,正規化是值得追求的;但是太多小型資料表可能會降低效能,或超過可開啟的檔案與記憶體容量。

比較可行的方法是只針對變更頻繁的資料運用第三正規形式。如果保留某些相依的欄位,請將應用程式設計為要求使用者在欄位變更時,驗證所有相關聯的欄位。

其他正規化形式

第四正規形式,也稱為「Boyce Codd 正規形式」(BCNF);而第五正規形式雖然存在,但實際設計時則很少考慮此形式。漠視這些規則可能會造成無法設計出最完美的資料庫,但不會影響資料庫功能。
               **********************************
正規化資料表的範例
               **********************************

正規化範例:

未正規化的資料表:

Student#   Advisor   Adv-Room  Class1   Class2   Class3
    -------------------------------------------------------
1022       Jones      412      101-07   143-01   159-02
4123       Smith      216      201-01   211-02   214-01
				
  1. 第一正規形式:沒有重複的群組

    資料表應該只有兩個維度。因為一個學生會上數種課程,所以課程應該另列資料表。上述記錄中的 Class1、Class2 & Class3 欄位即是設計問題所在。

    試算表經常使用第三維度,但是資料表不應該使用第三維度。解決此問題的另一個方式:使用一對多關聯性,不要將一邊與多邊放在相同的資料表中。而是應該藉由刪除重複的群組 (Class#),以第一正規形式建立另一個資料表,如下所示:
    Student#   Advisor   Adv-Room    Class#
           ---------------------------------------
    1022      Jones      412       101-07
    1022      Jones      412       143-01
    1022      Jones      412       159-02
    4123      Smith      216       201-01
    4123      Smith      216       211-02
    4123      Smith      216       214-01
    					
  2. 第二正規形式:刪除重複的資料

    請注意上述資料表中,每個 Student# 值都會配對多個 Class# 值。由於 Class# 在運用時並不會依賴 Student# (主索引鍵),因此這個關係並非第二正規形式。

    下列兩個資料表將示範第二正規形式:
    學生:Student#    Advisor   Adv-Room
                    ------------------------------
    1022        Jones       412
    4123        Smith       216
    
    註冊課程:Student#    Class#
                        ------------------
                        1022        101-07
                        1022        143-01
                        1022        159-02
                        4123        201-01
                        4123        211-02
                        4123        214-01
    					
  3. 第三正規形式:刪除不依賴索引鍵的資料

    最後一個範例中,Adv-Room (導師的辦公室編號) 在運用時會依賴 Advisor 屬性。而解決的方法,就是將該屬性從 [學生] 資料表移至 [教職員] 資料表,如下所示:
    學生:Student#    Advisor
                    -------------------
    1022        Jones
    4123        Smith
    
    教職員:Name    Room    Dept
                    --------------------
    Jones   412     42
    Smith   216     42
    					

?考

如需有關設計資料庫的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
234208 ACC2000:"Understanding Relational Database Design" Document Available in Download Center
《FoxPro 2 A Developer's Guide》,Hamilton M. Ahlo Jr. 等人,第 220-225 頁,M & T Books,1991

《Using Access for Windows》,Roger Jennings,第 799-800 頁,Que Corporation,1993

屬性

文章編號: 100139 - 上次校閱: 2007年11月20日 - 版次: 2.1
這篇文章中的資訊適用於:
  • Microsoft Access 1.0 Standard Edition
  • Microsoft Access 1.1 Standard Edition
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
關鍵字:?
kbinfo kbusage KB100139
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com