數據庫規范化:模式分解算法(3NF,BCNF分解,附帶口訣,通俗易懂)


前言

在理解模式分解的時候,發現模式分解算法比較難懂。於是想出了一個通俗易懂的解法,並且配有速記口訣!讓模式分解再也難不倒你。

知識儲備

首先在了解模式分解之前,你需要對數據庫規范化有一定的了解。這里我列出了幾個求模式分解的時候需要用到的知識。你可以直接點擊下面鏈接,跳轉到我另外的文章查看詳細內容。

函數依賴與三種范式

最小依賴集

候選碼

范式介紹

這里也對1NF,2NF,3NF,BCNF做一個簡明扼要的介紹。

1NF是指數據庫表的每一列都是不可分割的基本數據項,即實體中的某個屬性不能有多個值或者不能有重復的屬性。

2NF要求屬性完全依賴於主鍵,不能存在僅依賴主關鍵字一部分的屬性。

3NF要求每一個非主屬性既不部分依賴於碼也不傳遞依賴於碼。

BCNF消除了主屬性對候選碼的部分和傳遞函數依賴。

注:1.相對於BCNF,3NF允許存在主屬性對候選碼的傳遞依賴和部分依賴。

2.BCNF比較抽象,略作解釋:在學生信息表里,學號是一個候選碼,學號可確定學生姓名;(班級,學生姓名)也是一組候選碼,有(班級,學生姓名)->學號,因此在主屬性間形成了傳遞依賴。

模式分解算法

一、3NF分解

3NF分解一般分為兩種:保持依賴無損連接

為了說明求解保持依賴,我們先要會求最小依賴集

(1)最小依賴集求法:

口訣:

右側先拆單,依賴依次刪。

還原即可刪,再拆左非單。

通過求下面的最小依賴集對口訣進行解釋,

image-20200622220242411

如果想深入了解如何求最小依賴集,請參考:最小依賴集求法

(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} (注:范式分解並不唯一,正確即可)

二、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)}。

如有疑問請在評論區留言,看見了會第一時間回復的。更多數據庫規范化的內容,可以在欄目數據庫中繼續閱讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM