一. 范式
定義:范式是符合某一種級別的關系模式的集合。
關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式;
一個低一級范式的關系模式,通過模式分解(schema decomposition)可以轉換為若干個高一級范式的關系模式的集合,這種過程就叫規范化;
規范化的目的:減少數據冗余 ( minimal data redundancy )、消除異常(插入、刪除和更新)。
確定關系屬于第幾范式,首先要確定函數依賴和候選碼
1NF:屬性不能有多個值或者不能有重復的屬性;(不能有多值屬性)
對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫
2NF:非主屬性都完全函數依賴于任何一個候選碼(最小的超碼集合),沒有部分函數依賴(子集不能決定)
(候選碼指向每個非主屬性)
3NF: 不存在傳遞函數依賴
BCNF:每個決定屬性都包含候選碼(超碼)(只有兩個屬性的一定是BCNF)
如果一個關系數據庫中的所有關系模式都屬于BCNF,那么在函數依賴范疇內,它已實現了模式的徹底分解,達到了最高的規范化程度,消除了插入異常和刪除異常。
最小函數依賴集Fmin:
F中的函數依賴均不能由F中其他函數依賴導出,F中各函數依賴左部均為最小屬性集(不存在冗余屬性)。
Fmin求解過程:
- 用分解的法則,使F中的任何一個函數依賴的右部僅含有一個屬性;(右邊只能有一個屬性)
- 去掉多余的函數依賴:從第一個函數依賴X→Y開始將其從F中去掉,然后在剩下的函數依賴中求X的閉包X+,看X+是否包含Y,若是,則去掉X→Y;否則不能去掉,依次做下去。直到找不到冗余的函數依賴;
- 去掉各依賴左部多余的屬性。一個一個地檢查函數依賴左部非單個屬性的依賴。例如XY→A,若要判Y為多余的,則以X→A代替XY→A是否等價?若A?(X)+,則Y是多余屬性,可以去掉。
例子:
????????????????????????????????
LLJD:無損連接分解(依賴關系下的其他信息)
DPD:依賴保持分解(依賴關系本身)
LLJD-DPD-3NF算法:(兩個關系均保持)
輸入:關系模式 R,R 中的 FD F 集。
輸出:無損聯接和依賴項保留分解 D,使得 D 中的每個架構都在 3NF 中。
(1) 找到所有候選鍵;
(2) 計算 Fmin;
(3) 設 X->Ai, i=1,...,m,是 Fmin 中具有相同左側 X 的所有 FD。創建一個關系模式 XUA1U...UAm . ?如果 Am 不是現有關系架構的子架構,則為 D 中;
(4) 如果所有關系模式都不包含 R 的候選鍵,則使用候選鍵形成另一個關系模式。
例子:
????????????????
找候選碼的方法:(畫圖-->畫表格)
如圖畫出圖后,第一行是一定要的,候選碼中一定要有的;第二行是一定不要的;如果第一行的組合能決定R中所有元素,那么該組合是唯一的候選碼,否則則需要和第三行的元素進行組合,此時可能會有多個候選碼。
LLJD-BCNF算法(只能保證一個關系模式):
輸入:關系模式 R,R 中的一組 FD。
輸出:無損聯接分解 D,使得 D 中的每個新架構都在 BCNF 中。
?例子:
????????????????
????????????????
????????????????
注意:每個范式都是針對一張表的,所以比如BCNF只需要該表的決定因素都是該表的候選碼的超碼即可。