關係數據庫理論之範式

前言

範式應該算是關係數據庫中的難點了,難就難在對關係的分解上。最近在學習關係數據庫理論,就想着可以利用文章將思路捋捋。本文主要論述的是範式中有關函數依賴的部分,包括第一範式(1NF)、第二範式(2NF)、第三範式(3NF)以及BC範式(BCNF)。至於基於多值依賴的第四範式暫時不做討論。本文中的例子舉自《數據庫原理及應用技術教程》(清華大學出版社)。

這裏小小的插一句,如果你對關係、元組、碼等這些專用名詞(一般在開發中至少我不會這麼說)看不慣的話,就比如我,可以參考如下的同義替換。

  • 關係——二維表,也就是我們常說的數據庫中的表
  • 元組——表中的記錄
  • 碼——如果是主碼,就是主鍵的意思;若是外碼,就是外鍵的意思
  • 關係模式——表的定義,也就是我們常寫的create table…語句

這四大範式的關係

在正式論述之前,還是有必要了解一下這四大範式之間的關係:隨着範式等級的增高,其限制也就越多,對數據庫中的數據冗餘,插入異常、刪除異常等的解決效果也就越好。1NF、2NF、3NF、BCNF的關係可以表示爲下圖。

函數依賴

概念

函數依賴是這四大範式的基礎概念,只有瞭解了什麼是函數依賴,才能明白這四大範式具體是在做什麼。
函數依賴中的函數一詞,指的是我們在數學中常提及的單值函數,例如
y=ax+by = ax+b
其中,x叫自變量,y叫因變量。對於確定的自變量x,都有唯一的因變量y於其對應。
而函數依賴與其也相似,比如考慮以下關係:
SDC(SNO,SNAME,SAGE,DEPT,MN,CNO,GRADE)
SDC:關係名
SNO:學號
SNAME:姓名
SAGE:年齡
DEPT:系別
MN:系主任姓名
CNO:課程號
GRADE:成績
我們知道,在學校中,學號是唯一的,一個學生只能在一個系中學習,所以如果SNO確定,則SNAME、SAGE、DEPT也隨之唯一確定。我們就可以說(SNAME,SAGE,DEPT)函數依賴於SNO,記爲
SNOSNAMESNO \rightarrow SNAME (SNAME函數依賴於SNO。從後往前看,下同)
SNOSAGESNO \rightarrow SAGE
SNODEPTSNO \rightarrow DEPT
最後,我們給出函數依賴的定義

設關係模式R(U,F)U是屬性全集,FU上的函數依賴集,XYU的子集,如果對於R(U) 的任意一個可能關係r,對於X的每一個具體值,Y都有唯一的具體值與之對應,則稱X函數決定Y,或Y函數依賴於X,記作XYX \rightarrow Y

分類

函數依賴分爲:完全函數依賴、部分函數依賴、傳遞函數依賴

完全函數依賴

直接來看個例子,還是上面的SDC關係,在這個關係中,SNOGRADESNO \nrightarrow GRADE,因爲一個學生可以選修多門課程。CNOGRADECNO \nrightarrow GRADE,因爲一門課程會有多個成績。但是它們的組合就可以決定成績,即(SNO,CNO)GRADE(SNO,CNO) \rightarrow GRADE。因爲學號確定了,課程號也確定了,這個學生的成績也就唯一確定了。
(SNO,CNO)GRADE(SNO,CNO) \rightarrow GRADE這個函數依賴關係中,(SNO,CNO)的真子集,也就是SNO、CNO,都不能唯一確定GRADE的值,我們就把這樣的函數依賴,稱爲完全函數依賴。記爲(SNO,CNO)fGRADE(SNO,CNO)\rightarrow ^ fGRADE。(f應該在箭頭上的,打不出來TAT。。。),這裏f就是full(滿)的意思。
最後來看定義

設關係模式R(U) , U是屬性全集,XYU的子集,如果XYX \rightarrow Y,並且對於X的任何一個真子集X’,都有XYX' \nrightarrow Y,則稱YX完全函數依賴。記作XfYX \rightarrow^f Y

部分函數依賴

還是上面的關係SDC。我們已經知道SNODEPTSNO \rightarrow DEPT,而我們也可以說(SNO,CNO)DEPT(SNO,CNO) \rightarrow DEPT。此時,對於(SNO,CNO)的真子集SNO、CNO,有SNODEPTSNO \rightarrow DEPTCNODEPTCNO \nrightarrow DEPT。此時,我們可以說DEPT部分函數依賴於(SNO,CNO),記作(SNO,CNO)pDEPT(SNO,CNO) \rightarrow^p DEPT。這裏p就是partial(部分的)意思。
最後來看定義

設關係模式R(U) , U是屬性全集,XYU的子集,如果對X的某個真子集X’XYX' \rightarrow Y,則稱Y對X部分函數依賴,記作XpYX \rightarrow^p Y

只有當決定因素是組合屬性時,討論部分函數依賴纔有意義,當決定因素是單個屬性時,只能是完全函數依賴。

傳遞函數依賴

還是上面的關係SDC。SNODEPTSNO \rightarrow DEPT,因爲一名學生只能在一個系中上課。且DEPTMNDEPT \rightarrow MN,因爲一個系只能有一個系主任。所以在這裏SNO與DEPT就是傳遞函數依賴的關係,記作SNOtMNSNO \rightarrow^t MN。這裏t是transitive(可傳遞的)意思。
最後是定義

設關係模式R(U) , U是屬性全集,XYZU的子集,若XYX \rightarrow Y,但YXY \nrightarrow X,而YZY \rightarrow Z(YXY\notin XZYZ \notin Y),則稱ZX傳遞函數依賴,記作XtZX \rightarrow^t Z

主屬性與非主屬性

在一個關係中,如果一個屬性或者幾個屬性能夠唯一標識一個元組,我們就把它稱爲候選碼。在衆多候選碼中,我們選擇其中的一個爲主碼。
包含在任何一個候選碼中的屬性,稱爲主屬性不包含在任何中的屬性,稱爲非主屬性

注:下面範式中,在定義裏出現的,個人認爲,爲了方便理解,可以全部認爲是主碼。若有不道之處,還請在評論區多多指出~

範式

第一範式

如果關係模式R,其所有的屬性均爲簡單的、不可再分的,則稱R屬於第一範式。

第一範式是對關係數據庫最起碼的要求。

例如我們在上面提及的SDC關係,它就滿足第一範式

但是,在SDC關係中,存在着非主屬性對碼的部分函數依賴,比如
(SNO,CNO)pDEPT(SNO,CNO) \rightarrow^p DEPT
這就會導致數據冗餘等問題(對於系別信息來說需要存儲多次,有多少個學生就要存儲幾次),於是我們就需要第二範式。

第二範式

在關係模式滿足1NF的基礎上,且每個非主屬性都完全函數依賴於R的碼,則稱R屬於第二範式

對於SDC關係,(SNO,CNO)的關係組合爲這個關係的候選碼,也是主碼,因爲它能唯一標識一個學生的記錄。SNO、CNO爲主屬性,SNAME、SAGE、DEPT、MN、GRADE爲非主屬性。通過上面的論述,我們知道在這個關係中存在着部分函數依賴
(SNO,CNO)pDEPT(SNO,CNO) \rightarrow^p DEPT
其中,DEPT爲非主屬性,且它部分函數依賴於(SNO,CNO),所以這個SDC關係就不滿足第二範式的定義。
究其原因,是因爲在SDC(SNO,SNAME,SAGE,DEPT,MN,CNO,GRADE)關係中,描述了不止一件事。它從大體上描述了兩個個實體:學生的基本信息、學生的選課和成績信息。
爲了消除部分函數依賴,我們儘量做到一個關係就描述一個實體。在SDC關係中,我們可以拆分爲三個實體
學生與系別關系:
SD(SNO,SNAME,SAGE,DEPT,MN)
學生選課關係
SC(SNO,CNO,GRADE)
在SD關係中,SNO爲主碼,決定因素,也爲主屬性,SNAME,SAGE,DEPT,MN爲非主屬性。上面我們提過,如果決定因素爲單屬性,只能是完全函數依賴。所以SD關係滿足第二範式的定義。
在SC關係中,(SNO,CNO)爲主屬性,GRADE爲非主屬性。然而,(SNO,CNO)的真子集SNO、CNO都不能唯一確定GRADE的值,因爲一個學生可以選修多門課程,而一門課程也可以由多個學生選修,它們之間是多對多的關係。根據完全函數依賴的定義,GRADE完全函數依賴於(SNO,CNO)。所以關係SC滿足第二範式的定義。

不難看出,在關係SD中,非主屬性MN與主屬性SNO存在傳遞依賴,這也會導致一定的數據冗餘,插入異常等問題,這時就要引入第三範式。
在第二範式中,存在着以下兩條結論:

  • 從1NF關係中消除非主屬性對碼的部分函數依賴,則可以得到2NF關係。
  • 如果R的碼爲單屬性,或R的全體屬性均爲主屬性,則R屬於2NF。

第三範式

在滿足第二範式的基礎上,如果關係模式R的每個非主屬性都不傳遞依賴R的碼,則稱R屬於第三範式。

在第二範式中,我們將SDC關係分解成了SD和SC兩個關係,但是在關係SD中,SNO爲主屬性,DEPT爲非主屬性,存在SNODEPTSNO \rightarrow DEPT,且DEPTMNDEPT \rightarrow MN,而DEPTSNODEPT \nrightarrow SNOSNOtMNSNO \rightarrow^t MN。也就是說MN傳遞依賴與SNO,所以關係SD不滿足第三範式的定義。
究其原因,是因爲在關係SD中,我們還分得不夠細,在關係SD(SNO,SNAME,SAGE,DEPT,MN)中,還描述了兩個實體,即學生和系別。
所以我們把它在進行分解:
學生關係:
S(SNO,SNAME,SAGE)
系別關系:
D(DEPT,MN)
在S關係中,SAME,SAGE均與SNO不存在傳遞依賴。
在D關係中,MN不與DEPT存在傳遞依賴。
故S關係與D關係滿足第三範式定義。

顯然,在SC關係中GRADE不會傳遞依賴於(SNO,CNO)
所以,SC滿足第三範式定義。

一般來說,在進行關係分解時,分解到3NF就足夠了。
但是2NF、3NF都只限制了非主屬性對碼的依賴關係,而沒有限制主屬性之間對碼的依賴關係,這依然可能存在着數據冗餘等問題,所以要引入BC範式。

BC範式

如果關係模式R屬於1NF,且所有的函數依賴XYX \rightarrow Y(YXY\notin X),決定因素X都包含了R的一個候選碼,則稱R屬於BC範式。

定義看着很暈,對吧,不怕,我們來看一個例子。
設關係模式SNC(SNO,SNAME,CNO,GRADE)
SNO:學號
SNAME:學生姓名
CNO:課程號
GRADE:成績
假設這裏不存在重名現象
不難看出,要想唯一標識這個關係中的一個元組,只要確定SNO、CNO的值或者SNAME、CNO的值就可以了。因爲不存在重名現象,一旦SNO確定,SNAME也隨之確定,而一個學生可以選修多門課程,一門課程只有一個成績,所以CNO也應該納入範圍。
在這個關係中,有兩個候選碼(SNO,CNO)和(SNAME,CNO)
在這個關係中,主屬性爲SNO、SNAME、CNO,非主屬性爲GRADE
所以,函數依賴關係如下:
(SNO,CNO)GRADE(SNO,CNO) \rightarrow GRADE
(SNAME,CNO)GRADE(SNAME,CNO) \rightarrow GRADE
非主屬性GRADE,對(SNO,CNO)以及(SNAME,CNO)都爲完全函數依賴,且不存在傳遞依賴,所以SNC屬於第三範式
我們現在着重看主屬性,由於SNO與SNAME是一對一的關係,所以存在着以下部分函數依賴
(SNAME,CNO)pSNO(SNAME,CNO) \rightarrow^p SNO
(SNO,CNO)pSNAME(SNO,CNO) \rightarrow^p SNAME
也就是說,在一個關係的主屬性中,存在這部分函數依賴,這就不滿足BC範式的定義。

BCNF的規範化是指把3NF關係模式通過投影分解轉換成BCNF關係模式的集合
注意:前提要是這個關係已經是3NF

在SNC關係中,我們描述了兩個實體,這兩個實體是學生關係和選課關係,我們把它們加以分解,就可以消除上面說的主屬性之間的函數依賴。
學生關係:
S(SNO,SNAME)
選課關係:
SC(SNO,CNO,GRADE)
在S關係中,SNO爲主屬性,且是單一的,不存在主屬性之間的部分函數依賴。非主屬性SNAME也與SNO不存在部分、傳遞函數依賴。
在SC關係中,SNO、CNO爲主屬性,它們之間也不存在部分函數依賴。非主屬性GRADE與(SNO,CNO)也不存在部分、傳遞函數依賴。
所以,它們都滿足BCNF。
最後說一說BCNF的性質:

  • 滿足BCNF的關係減消除任何屬性(包括主屬性與非主屬性)對碼的部分函數依賴和傳遞函數依賴。也就是說,如果RBCNFR\in BCNF,則R也是3NF。
  • 如果R3NFR\in 3NF,則R不一定是BCNF。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章