數據庫規範化

要討論數據庫範式,首先不得不解釋的是函數依賴的概念。設R(U)是屬性集U上的關係模式。X和Y是U的子集。若對於R(U)上的任意一個可能的關係r,如果r中不可能存在兩個元組,它們在X上的屬性值相等,而在Y上的屬性值不等,則稱X函數決定Y或Y函數依賴於X,記作X->Y。
總而言之,這段話可以總結爲當X屬性值決定Y屬性值時,則稱X決定Y,或Y依賴於X。
舉個簡單的例子:
設計學生表時,學生的學號可以決定學生的姓名,學生姓名依賴於學生學號。
在函數依賴中還有平凡函數依賴與非平凡函數依賴,完全函數依賴與部分函數依賴,傳遞函數依賴等幾種特殊的函數依賴。
(1)平凡與非平凡函數依賴
設R(U)是屬性集上的一個關係模式。X和Y是U的子集。如果X->Y,且Y不屬於X則稱其爲非平凡函數依賴。若X->Y且Y屬於X,則稱X->Y是平凡函數依賴。
由此可見一般函數依賴都爲平凡函數依賴。
(2)完全函數依賴與部分函數依賴。
在R(U)中,如果X->Y,並且對於X的任何一個真子集X',都有X'-\>Y,則稱Y對X完全函數依賴,記作:X-f>Y.
若X->Y,但Y不完全函數依賴於X,則稱Y對X部分函數依賴,記作X-p>Y。
例如 學生表(學號,課程號,年級,學生宿舍)關係中,部分函數依賴:(學號,課程號)→ 學生宿舍 因爲 學號 → 學生宿舍 成立

(3)傳遞函數依賴。
在R(U)中,如果X->Y,Y->Z,且Y不屬於X,Y->X,則稱Z傳遞函數依賴於X,記作X-t>Z。
在此加上條件Y-\>X,是因爲如果X->Y,Y->Z,則X<-->Y,實際上就是X-直接>Z,是直接函數依賴,而不是傳遞函數依賴。

---
接下來開始看看何爲範式。
在關係數據庫規範化過程中,爲不同程度的規劃化要求設立的不同標準稱爲範式。
第一範式(1NF):
定義:如果關係模式R的所有屬性都是不可分的數據項,則稱R屬於第一範式,記爲R屬於1NF。
不到第一範式
學生(姓名,性別年齡)----(因爲性別年齡列包括了兩個屬性)
第一範式
學生(姓名,性別,年齡)---(R的所有屬性都不可在分了)
第二範式(2NF):
若關係模式R屬於1NF,且每個非主屬性都完全函數依賴於R的鍵,則R屬於2NF。即第二範式主要目的爲消除非主屬性對主屬性的部分函數依賴。
那麼爲什麼需要消除部分依賴呢?
有這樣一個關係模式,
學生(學號,姓名,系別,住處,課程號,成績)
對於以上關係,學號->姓名,學號->系別
存在以下問題:
1,數據冗餘
因爲姓名等部分依賴於(學號,成績),所以增添數據每個系的系名和學生住處重複出現,浪費空間。
2,更新異常
由於數據的冗餘,當更新數據庫中的數據時,系統需要付出很大的代價來維護數據庫的完整性,否則會造成數據的不一致。
3,插入異常
如果某個學生沒有選課那麼學生有關信息不能插入。
4,刪除異常
若某個系學生全部畢業,在刪除該系學生信息的同時,這個系的相關信息也一併被刪除。但是事實上該系仍然存在。
一個關係模式中若存在部分函數依賴,則必然有主屬性與非主屬性之間無聯繫的無關項,則必然會產生上述問題。所以我們需要消除部分函數依賴,這就是第二範式所要求做到的。
消除部分函數依賴可以採用投影分解法,將部分函數依賴從其中分解出來。
分解後的關係模式應非主屬性對主屬性都是完全函數依賴。
第三範式(3NF):
關係模式R<U,F>中若不存在這樣的鍵X,屬性組Y及非主屬性Z(Z不屬於Y),使得X->Y,Y->Z成立,且Y->X,則稱R屬於3NF。
由此可見,第三範式的目的在於消除傳遞函數依賴,之所以要消除傳遞函數依賴是因爲,假設X->Y,Y->Z,然而Z並不是直接依賴於X,所以對X所做的某些操作不需要影響到Z,而Y即依賴於X,也被依賴着,即Y在某種程度上有其獨立性,可以單獨存在不被影響決定,有些針對Y的操作勢必會同時影響到X與Z,而且Y不屬於X,針對X的有些操作不需要影響到Y,針對Y的操作有時不需要影響X,但並沒有必要造成這種影響,所以我們要消除傳遞函數依賴。
舉個例子:
學號 宿舍 費用
062201 A 900
062230 B 1200
062240 B 1200
學號確定宿舍、宿舍確定費用,且有學號不包含宿舍,宿舍不確定學號,符合傳遞函數依賴條件。
所以以上關係R存在添加異常(建了C宿舍但是沒人住無法添加了)刪除異常(學生062201退學了宿舍A也刪除掉)。
綜上爲了避免異常,我們需要消除它。
BC範式:
由於3NF僅僅規定了非主屬性的對鍵的依賴關係。沒有限制主屬性對鍵依賴。若存在主屬性對鍵的部分函數依賴與傳遞函數依賴,必然會產生上面類似的問題。故又引入了BC範式。
設關係模式R<U,F>∈1NF,如果對於R的每個函數依賴X→Y,若Y不屬於X,則X必含有候選碼,那麼R∈BCNF。
相對於第三範式,BC範式的要求更加嚴格。第三範式只是要求R爲第二範式且非鍵屬性不傳遞依賴於R的候選鍵,而BC範式則是對R的每個屬性都做要求。
在關係模式STJ(S,T,J)中,S表示學生,T表示教師,J表示課程。
每一教師只教一門課。每門課由一名教師教,某一學生選定某門課,就確定了一個固定的教師。某個學生選修某個教師的課就確定了所選課的名稱 : (S,J)→T,(S,T)→J,T→J
由關係模式的定義可以得到如下結論,若R屬於BCNF,則R有:
1.所有非主屬性對每一個碼都是完全函數依賴。
2.所有的主屬性對每一個不包含它的碼,也是完全函數依賴。
3.沒有任何屬性完全函數依賴於非碼的任何一組屬性。
由於R∈BCNF,按定義排除了任何屬性對碼的傳遞依賴與部分依賴,所以R∈3NF。但是若R∈3NF,則R未必屬於BCNF。

---
第四範式以及多值依賴還不太懂,一般若達到BC範式,則在函數依賴範疇上就已經消除了數據冗餘,插入,和刪除異常。

發佈了25 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章