1. 程式人生 > >資料庫學習之-------三大正規化

資料庫學習之-------三大正規化

為什麼會出現三大正規化呢?什麼是三大正規化?首先我們需要來理解以下的基本概念:
         關係:資料庫中的一張二維表
         資料依賴:資料間的相互關係
         函式依賴:屬於資料依賴的一個分支,前者資料值確定後,後者資料值唯一指定,也就是說後者資料的值依賴前者!例如:由於一個學號只對應一個學生,一個學生只在一個系,所以當學號確定後,他的姓名以及所在的系就唯一確定了。
         然後,我們來建立一個數據庫,該資料庫涉及的物件包括學號(Sno)、所在系(Sdept)、每個系的學生住處(Sloc)、選修課程號(Cno)和成績(Grade),我們得到該關係模式:
          SLC(Sno,Sdept,Sloc,Cno,Grade)
          它的主碼:由Sno和Cno共同決定!
 正規化:符合某一種級別的關係模式的集合
         1.第一正規化:如果一個關係模式中的所有屬性都是不可分的基本資料項,那麼就屬於第一正規化,基本上所有關係模式都滿足第一正規化!


 所以上述建立的資料庫也屬於第一正規化!
 資料庫之間的函式依賴包括:
          (Sno,Cno)--->Grade
            Sno--->Sdept
          (Sno,Cno)--->Sdept
            Sno--->Sloc
          (Sno,Cno)--->Sloc
            Sdept--->Sloc(因為每個系只住在一個地方)
 通過實際生活,我們發現這個關係存在如下一些問題:
 (1)插入異常:假如要插入一個未選課學生的資訊,因為主碼丟失,所以插入異常
 (2)刪除異常:加入一個學生不選修3號課程了,那麼我們必須將他的選修3和課程刪除,但課程號是主碼,刪除整條學生記錄會跟著刪除,即不應該刪除的資訊也刪除了
 (3)資料冗餘度大:
如果一個學生選修了10門課程,那麼他的Sdept和Sloc就會在資料庫中重複儲存10次
 (4)修改複雜:假如一個學生選修了10門課程,但後來轉系了,那麼我們就要重複修改每一條Sdept和Sloc的值
 因為出現了上述這些問題,為了解決,出現了第二正規化:
 分析原因:Sdept,Sloc非主屬性對碼的部分函式依賴
         2.第二正規化:在第一正規化的關係模式上消除部分函式依賴,分解形成的關係模式
 將上述關係模式SLC分解成如下兩個關係模式:
              SC(Sno,Cno,Grade)
              SL(Sno,Sdept,Sloc)
 分解後的關係模式中,可以發現,非主屬性完全依賴主碼!
 解決了第一正規化遺留的問題:
 (1)在SL關係中可以插入尚未選課的學生記錄
 (2)刪除某學生的選修記錄只需要在SC關係中進行,不會影響該學生在SL關係中的資訊
 (3)某個學生選修10門課程,只需要在SL關係中儲存一次Sdept和Sloc的值
 (4)某個學生轉系後,也只需要在SL關係中修改一次該學生Sdept和Sloc的值

 但是通過實際生活,我們發現這個關係也存在如下一些問題:
 (1)插入異常:如果某個原因,某個系剛成立,還沒有學生,那麼因為沒有主碼的支援,該系的資訊就無法存入資料庫中
 (2)刪除異常:如果某個系學生全部畢業了,在刪除該系學生記錄的同時,也將這個系的資訊丟掉了!
 (3)資料冗餘度大:每一個系的學生都住在一個地方,關於系的住處的資訊卻重複出現,出現的次數與該系的學生人數有關
 (4)修改複雜:當某個系的地址傳送改變時候,該系所以學生的Sloc都有重複修改
 因為出現了上述這些問題,為了解決,出現了第三正規化:
 分析原因:Sloc傳遞函式依賴與Sno
         3.第三正規化:在第二正規化的關係模式上消除傳遞函式依賴,分解形成的關係模式
 將上述關係模式SL分解成如下兩個關係模式:
          SD(Sno,Sdept)
          DL(Sdept,Sloc)
 解決了第二正規化的遺留問題:
 (1)在DL關係中可以插入無在校學生的系的資訊
 (2)某個系的學生全部畢業了,只是刪除了SD中的記錄,對DL中系的資訊沒影響
 (3)每個系的學生的Sloc只需要在DL中儲存一次
 (4)某個系地址改變,也只需要在DL中改變一次Sloc的值

         當然了,第三正規化也會有些問題,在此基礎上又會形成多個不同型別的正規化,但是並不意味著關係的規範化程度越高越好,在此僅介紹了三大正規化,想了解其他正規化的可以查閱相關資料。
         總結:三大正規化其實是對原有資料庫關係出現某些問題的一種解決思想,即將原先資料庫表儘可能一步步進行解耦,消除原先資料依賴中不合適的部分,使各個關係模式達到某種程度上的分離!本質既可以解決邏輯上對資料庫操作的異常,也可以解決資料庫記憶體冗餘響應慢等問題,所以在資料庫設計中極其重要!!!