資料庫學習之-------三大正規化
阿新 • • 發佈:2019-02-11
為什麼會出現三大正規化呢?什麼是三大正規化?首先我們需要來理解以下的基本概念:
關係:資料庫中的一張二維表
資料依賴:資料間的相互關係
函式依賴:屬於資料依賴的一個分支,前者資料值確定後,後者資料值唯一指定,也就是說後者資料的值依賴前者!例如:由於一個學號只對應一個學生,一個學生只在一個系,所以當學號確定後,他的姓名以及所在的系就唯一確定了。
然後,我們來建立一個數據庫,該資料庫涉及的物件包括學號(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)資料冗餘度大:
(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的值
當然了,第三正規化也會有些問題,在此基礎上又會形成多個不同型別的正規化,但是並不意味著關係的規範化程度越高越好,在此僅介紹了三大正規化,想了解其他正規化的可以查閱相關資料。
總結:三大正規化其實是對原有資料庫關係出現某些問題的一種解決思想,即將原先資料庫表儘可能一步步進行解耦,消除原先資料依賴中不合適的部分,使各個關係模式達到某種程度上的分離!本質既可以解決邏輯上對資料庫操作的異常,也可以解決資料庫記憶體冗餘響應慢等問題,所以在資料庫設計中極其重要!!!