前言
在理解模式分解的時候,發現模式分解算法比較難懂。因而想出了一個通俗易懂的解法,而且配有速記口訣!讓模式分解再也難不倒你。html
知識儲備
首先在瞭解模式分解以前,你須要對數據庫規範化有必定的瞭解。這裏我列出了幾個求模式分解的時候須要用到的知識。你能夠直接點擊下面連接,跳轉到我另外的文章查看詳細內容。算法
函數依賴與三種範式數據庫
最小依賴集函數
候選碼spa
範式介紹
這裏也對1NF,2NF,3NF,BCNF作一個簡明扼要的介紹。.net
1NF是指數據庫表的每一列都是不可分割的基本數據項,即實體中的某個屬性不能有多個值或者不能有重複的屬性。htm
2NF要求屬性徹底依賴於主鍵,不能存在僅依賴主關鍵字一部分的屬性。blog
3NF要求每個非主屬性既不部分依賴於碼也不傳遞依賴於碼。get
BCNF消除了主屬性對候選碼的部分和傳遞函數依賴。class
注:1.相對於BCNF,3NF容許存在主屬性對候選碼的傳遞依賴和部分依賴。
2.BCNF比較抽象,略做解釋:在學生信息表裏,學號是一個候選碼,學號可肯定學生姓名;(班級,學生姓名)也是一組候選碼,有(班級,學生姓名)->學號,所以在主屬性間造成了傳遞依賴。
模式分解算法
1、3NF分解
3NF分解通常分爲兩種:保持依賴和無損鏈接。
爲了說明求解保持依賴,咱們先要會求最小依賴集。
(1)最小依賴集求法:
口訣:
右側先拆單,依賴依次刪。
還原便可刪,再拆左非單。
經過求下面的最小依賴集對口訣進行解釋,
若是想深刻了解如何求最小依賴集,請參考:最小依賴集求法
(2)3NF分解:
口訣:
保函依賴分解題,先求最小依賴集。
依賴兩側未出現,分紅子集放一邊,剩餘依賴變子集。
若要鏈接成無損,再添候選作子集。
例題
例1.已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函數依賴的3NF分解,和具備無損鏈接性及保持函數依賴的3NF分解
第一步:保函依賴分解題,先求最小依賴集。
先求出R的最小依賴集,可得F={A ->D,E->D,D->B,BC->D,DC->A}
第二步:依賴兩側未出現,分紅子集放一邊。
首先能夠發現沒有不出如今兩側的元素不用單獨分出一個子集,「剩餘依賴變子集」而後咱們將各依賴分別劃分爲子集獲得:{AD} {ED} {DB} {BCD} {DCA},即爲所求保持函數依賴的3NF分解
第三步:若要鏈接成無損,再添候選作子集。
(1)候選碼的求解:所謂候選碼即能決定整個關係的,咱們經過找未出如今依賴右邊的和兩側均未出現的元素便可求得,
(2)能夠發現C E未出如今右邊,所以候選碼爲{CE}。故所求具備無損鏈接性及保持函數依賴的3NF分解爲{AD} {ED} {DB} {BCD} {DCA} {CE}。
**例2.**關係模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},將關係模式分解爲3NF且保持函數依賴
將關係模式分解爲3NF且保持函數依賴:
**第一步:保函依賴分解題,先求最小依賴集。**先求出R的最小依賴集,
假設B->G冗餘,則(B)+=BD,沒有G故不冗餘。
假設CE->B冗餘,則(CE)+=CEGDA,沒有B故不冗餘。
假設C->A冗餘,則(C)+=CD,故不冗餘。
一次能夠獲得最小函數依賴集Fm={B->G,CE->B,C->A,B->D,C->D}
第二步:依賴兩側未出現,分紅子集放一邊,剩餘依賴變子集。
首先能夠發現沒有不出如今兩側的元素,而後咱們將各依賴分別劃分爲子集得{BG} {CEB} {CA} {BD} {CD},即爲所求保持函數依賴的3NF分解
第三步:若要鏈接成無損,再添候選作子集。
找到R的一個候選碼爲{ACE}。故所求具備無損鏈接性及保持函數依賴的3NF分解爲{BG} {CEB} {CA} {BD} {CD} {CE} (注:範式分解並不惟一,正確便可)
2、BCNF分解:
將關係模式R<U,F>分解爲一個BCNF的基本步驟是
1)先求最小依賴集,候碼非碼成子集
2)餘下左側全候碼,完成BCNF題。
例.關係模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},將關係模式分解爲3NF且保持函數依賴
將關係模式分解爲3NF且保持函數依賴:
第一步:先求最小依賴集。
能夠發現CE->G多餘,所以最小依賴集爲F={B->G,CE->B,C->A,B->D,C->D}。
第二步:候碼非碼成子集。
因爲候選碼爲(CE)所以將CE->B劃分出子集(BCE),而B->G,B->D左側均不含主屬性(C、E)中的任何一個故劃分出(BG),(BD)
第三步:
此時剩餘依賴F={C->A,C->D}剩餘元素{A,C,D}檢查發現函數依賴左側都是候選碼即完成BCNF分解,若是不知足則繼續分解餘下的。
因而BCNF分解的最後結果爲{(BG),(BD),(ACD),(BCE)}。
劃分出(BG),(BD)
第三步:
此時剩餘依賴F={C->A,C->D}剩餘元素{A,C,D}檢查發現函數依賴左側都是候選碼即完成BCNF分解,若是不知足則繼續分解餘下的。
因而BCNF分解的最後結果爲{(BG),(BD),(ACD),(BCE)}。
若有疑問請在評論區留言,看見了會第一時間回覆的。更多數據庫規範化的內容,能夠在欄目數據庫中繼續閱讀。