在網(wǎng)上看了許多有關數(shù)據(jù)庫函數(shù)依賴考題的分析,大都信息不全或者講不完整,甚至是胡言亂語,看的我也是云里霧里。在淺淺的了解一番之后,決定總結一下有關這方面的做題技巧,為了加深印象也為了應付考試,于是就有了這篇文章。
閱讀須知:數(shù)據(jù)庫函數(shù)依賴的部分概念非常多,也十分難理解,如果單純看書那會發(fā)現(xiàn)根本看不懂(比如我,書上各式各樣的符號解釋讓人眼花繚亂)。所以本文大都以例子來說明,碰到相關概念再展開定義。
屬性集的閉包令 α \alpha α 是一個屬性集,我們將函數(shù)依賴集 F F F 下被函數(shù)確定的所有屬性的集合稱為 F F F 下 α \alpha α 的閉包。
求解屬性集閉包書上的算法就不看了,看了也看不懂,直接看題目。
E x a m p l e : G i v e n R < U , F > , R = { A , B , C , D , E } , F = { B → C D , A D → E , B → A } Example:Given \R,R=\{A,B,C,D,E\},F=\{B\rightarrow CD,AD\rightarrow E,B\rightarrow A\} Example:GivenR,R={A,B,C,D,E},F={B→CD,AD→E,B→A}
解:
1.
R
e
s
u
l
t
{
B
C
}
2.
R
e
s
u
l
t
{
A
B
C
D
}
3.
R
e
s
u
l
t
{
A
B
C
D
E
}
1.Result\{BC\} \\ 2.Result\{ABCD\}\\ 3.Result\{ABCDE\}
1.Result{BC}2.Result{ABCD}3.Result{ABCDE}
很簡單,只要根據(jù)函數(shù)依賴集一步步推到就可以得到,首先是閉包初始狀態(tài)
B
C
BC
BC,接著分別考慮每一個狀態(tài),根據(jù)依賴
B
→
C
D
,
B
→
A
B\rightarrow CD,B\rightarrow A
B→CD,B→A ,可以將
A
A
A 和
D
D
D 加入到閉包中,最后由
A
D
→
E
AD\rightarrow E
AD→E,將
E
E
E 也加入到閉包當中。當剛求出的屬性閉包與上一個閉包相同時或者已經(jīng)求出了所有的屬性
U
U
U 時,就停止計算。
E x a m p l e : G i v e n R < U , F > , R = { A , B , C , D , E , H } , F = { A → B , B → D H , A → H , C → E } Example:Given \R,R=\{A,B,C,D,E,H\},F=\{A\rightarrow B,B\rightarrow DH,A\rightarrow H,C\rightarrow E\} Example:GivenR,R={A,B,C,D,E,H},F={A→B,B→DH,A→H,C→E}
有了上面的經(jīng)驗,這個是不是很簡單了呢?
解:
1.
R
e
s
u
l
t
{
A
}
2.
R
e
s
u
l
t
{
A
B
H
}
3.
R
e
s
u
l
t
{
A
B
D
H
}
1.Result\{A\} \\2.Result\{ABH\}\\3.Result\{ABDH\}
1.Result{A}2.Result{ABH}3.Result{ABDH}
直接說定理:如果 Y Y Y 屬于 X X X 的屬性集閉包,那么依賴 X → Y X \rightarrow Y X→Y 成立,反之也如此。即 X → Y ? Y ? ( X F ) + X \rightarrow Y \Leftrightarrow Y \subseteqq(X_F)^+ X→Y?Y?(XF?)+
可能還是過于抽象,直接看題。還是上面的例二,問函數(shù)依賴 A → D A \rightarrow D A→D 成立嗎?
解:
可以求得屬性閉包 ( A ) + = { A 、 B 、 D 、 H } (A)^+=\{A、B、D、H\} (A)+={A、B、D、H},因為 H ? ( A ) + H \subseteqq(A)^+ H?(A)+,所以此依賴成立。
求解最小依賴集求解最小依賴集需要用到上述判斷依賴集。
還是直接上題目。
E x a m p l e : G i v e n R < U , F > , R = { A , B , C , D , E , I } , F = { A → C , A B → C , C → D I , C D → I , E C → A B , E I → C } Example:Given \R,R=\{A,B,C,D,E,I\},F=\{A\rightarrow C,AB\rightarrow C,C\rightarrow DI,CD\rightarrow I,EC\rightarrow AB,EI\rightarrow C\} Example:GivenR,R={A,B,C,D,E,I},F={A→C,AB→C,C→DI,CD→I,EC→AB,EI→C}
解:
第一步右部化為單屬性,經(jīng)過分解后上述依賴集就變成如下依賴集:
F
=
{
A
→
C
,
A
B
→
C
,
C
→
D
,
C
→
I
,
C
D
→
I
,
E
C
→
A
,
E
C
→
B
,
E
I
→
C
}
F=\{A\rightarrow C,AB\rightarrow C,C\rightarrow D,C\rightarrow I,CD\rightarrow I,EC\rightarrow A,EC\rightarrow B,EI\rightarrow C\}
F={A→C,AB→C,C→D,C→I,CD→I,EC→A,EC→B,EI→C}
第二步判斷依賴是否可以去除。把依賴集中的每一個依賴一個個嘗試,看把這個依賴去掉后,還能不能導出這個依賴關系,如果能,則依賴多余要去除;如果不能,則保留。如果看能不能導出依賴關系呢?就要用到我們上述判斷函數(shù)依賴是否成立了,其實就是判斷依賴式左邊的閉包包不包含右邊。
舉例,把 A → C A\rightarrow C A→C 去掉(已經(jīng)去掉了,此依賴就不可用了),就看 A A A 的閉包里還有沒有 C C C,再結合之前求解閉包的方法,可以知道 ( A ) + = { A } (A)^+=\{A\} (A)+={A},并沒有 C C C,所以此依賴不多余,不可去除。再判斷 A B → C AB\rightarrow C AB→C ,可得 ( A B ) + = { A 、 B 、 C 、 D 、 I } (AB)^+=\{A、B、C、D、I\} (AB)+={A、B、C、D、I},包含 C C C,也就說明沒有這個依賴,此依賴也可以得到,所以把它去掉。再繼續(xù)判斷下一個直到最后,需要注意的是,此時 A B → C AB\rightarrow C AB→C 已經(jīng)去掉,之后的判斷過程就不可再用此依賴了。
最后我們得到依賴集:
F
=
{
A
→
C
,
C
→
D
,
C
D
→
I
,
E
C
→
A
,
E
C
→
B
,
E
I
→
C
}
F=\{A\rightarrow C,C\rightarrow D,CD\rightarrow I,EC\rightarrow A,EC\rightarrow B,EI\rightarrow C\}
F={A→C,C→D,CD→I,EC→A,EC→B,EI→C}
第三步判斷左部冗余屬性。找到依賴式左部屬性大于等于2的,然后依次去除一個屬性,判斷剩余屬性的閉包能否推斷出依賴式右部,如果能,則說明去除的屬性多余,去掉;如果不能,則說明去除的屬性有用,保留。
由于
A
→
C
,
C
→
D
A\rightarrow C,C\rightarrow D
A→C,C→D 左部已經(jīng)是單屬性,就不考慮。直接看第三個
C
D
→
I
CD\rightarrow I
CD→I,首先去掉屬性
C
C
C,計算
(
D
)
+
=
{
D
}
(D)^+=\{D\}
(D)+={D},說明沒有
C
C
C 推不出來
I
I
I,即
C
C
C 不可去掉,同理刪除
D
D
D,計算
(
C
)
+
=
{
C
、
D
、
I
}
(C)^+=\{C、D、I\}
(C)+={C、D、I},說明沒有
D
D
D 也能推出來
I
I
I,即
D
D
D 可去掉。再依次判斷接下來的幾個,最后得到最小依賴集:
F
=
{
A
→
C
,
C
→
D
,
C
→
I
,
E
C
→
A
,
E
C
→
B
,
E
I
→
C
}
F=\{A\rightarrow C,C\rightarrow D,C\rightarrow I,EC\rightarrow A,EC\rightarrow B,EI\rightarrow C\}
F={A→C,C→D,C→I,EC→A,EC→B,EI→C}
整個求解過程較為繁瑣。需要注意的是第二步和第三步的細微區(qū)別。第二步判斷依賴是要先把依賴刪除,再利用其他的依賴關系看看能不能推出來此依賴,而第三步判斷冗余屬性時原本的依賴式是全部可用的。
再看一個例子吧。
E x a m p l e : G i v e n R < U , F > , R = { A , B , C } , F = { A → B C , B → C , A → B , A B → C } Example:Given \R,R=\{A,B,C\},F=\{A\rightarrow BC,B\rightarrow C,A\rightarrow B,AB\rightarrow C\} Example:GivenR,R={A,B,C},F={A→BC,B→C,A→B,AB→C}
解:
第一步右部化為單屬性,經(jīng)過分解后上述依賴集就變成如下依賴集:
F
=
{
A
→
B
,
A
→
C
,
B
→
C
,
A
B
→
C
}
F=\{A\rightarrow B,A\rightarrow C,B\rightarrow C,AB\rightarrow C\}
F={A→B,A→C,B→C,AB→C}
第二步判斷是否有多余依賴式??梢园l(fā)現(xiàn)式子
A
→
C
,
A
B
→
C
A\rightarrow C,AB\rightarrow C
A→C,AB→C 都是多余的,所以刪除。
第三步由于沒有左部多屬性的式子,所以不用判斷,即此依賴集的最小依賴集:
F
=
{
A
→
B
,
B
→
C
}
F=\{A\rightarrow B,B\rightarrow C\}
F={A→B,B→C}
其實正則覆蓋只是在最小依賴集最后多加了一步合并。因為正則覆蓋有定義:
F F F 中不可以存在兩個依賴 α 1 → β 1 , α 2 → β 2 \alpha_1\rightarrow \beta_1,\alpha_2\rightarrow \beta_2 α1?→β1?,α2?→β2?,滿足 α 1 = α 2 \alpha_1=\alpha_2 α1?=α2?
E x a m p l e : G i v e n R < U , F > , R = { A , B , C , D , E } , F = { A → B C , B C D → E , B → D , A → D , E → A } Example:Given \R,R=\{A,B,C,D,E\},F=\{A\rightarrow BC,BCD\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} Example:GivenR,R={A,B,C,D,E},F={A→BC,BCD→E,B→D,A→D,E→A}
解:
前面還是按照求解最小依賴集的方式。
第一步右部化為單屬性,經(jīng)過分解后上述依賴集就變成如下依賴集:
F
=
{
A
→
B
,
A
→
C
,
B
C
D
→
E
,
B
→
D
,
A
→
D
,
E
→
A
}
F=\{A\rightarrow B,A\rightarrow C,BCD\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\}
F={A→B,A→C,BCD→E,B→D,A→D,E→A}
第二步判斷是否有多余依賴式??梢园l(fā)現(xiàn)式子
A
→
D
A\rightarrow D
A→D 是多余的,所以刪除。此時依賴集:
F
=
{
A
→
B
,
A
→
C
,
B
C
D
→
E
,
B
→
D
,
E
→
A
}
F=\{A\rightarrow B,A\rightarrow C,BCD\rightarrow E,B\rightarrow D,E\rightarrow A\}
F={A→B,A→C,BCD→E,B→D,E→A}
第三步判斷冗余屬性,我們只需要判斷
B
C
D
→
E
BCD\rightarrow E
BCD→E 即可,可以得到屬性
D
D
D 是多余的,所以去除。得到最小依賴集:
F
=
{
A
→
B
,
A
→
C
,
B
C
→
E
,
B
→
D
,
E
→
A
}
F=\{A\rightarrow B,A\rightarrow C,BC\rightarrow E,B\rightarrow D,E\rightarrow A\}
F={A→B,A→C,BC→E,B→D,E→A}
根據(jù)正則覆蓋的定義,需要把
A
→
B
,
A
→
C
A\rightarrow B,A\rightarrow C
A→B,A→C 合并,最后的正則覆蓋:
F
=
{
A
→
B
C
,
B
C
→
E
,
B
→
D
,
E
→
A
}
F=\{A\rightarrow BC,BC\rightarrow E,B\rightarrow D,E\rightarrow A\}
F={A→BC,BC→E,B→D,E→A}
如何快速選出候選碼?我總結了一個方法:
還是有點抽象哈,舉例子。
E x a m p l e : G i v e n R < U , F > , R = { A , B , C , D } , F = { A B → C , A C → B D } Example:Given \R,R=\{A,B,C,D\},F=\{AB\rightarrow C,AC\rightarrow BD\} Example:GivenR,R={A,B,C,D},F={AB→C,AC→BD}
解:
首先看從未再依賴式右部出現(xiàn)的屬性為 A A A,所以先看 ( A ) + = { A } ≠ U (A)^+=\{A\}\neq U (A)+={A}?=U,所以 A A A 不是候選碼,然后逐一添加屬性,判斷 ( A B ) + = { A B C D } = U (AB)^+=\{ABCD\}= U (AB)+={ABCD}=U,所以 A B AB AB 是候選碼,接著判斷 ( A C ) + = { A B C D } = U (AC)^+=\{ABCD\}= U (AC)+={ABCD}=U,所以 A C AC AC 也是候選碼,最后 ( A D ) + = { A D } ≠ U (AD)^+=\{AD\}\neq U (AD)+={AD}?=U,所以 A D AD AD 不是候選碼。
此時就不用添加屬性了,因為已經(jīng)是長度最小了。所以此依賴集的候選碼集合就是 { A B , A C } \{AB,AC\} {AB,AC}
判斷范式1NF、2NF、3NF、BCNF的概念書上都有,不做過多解釋了,我自己也看不懂那個殺軟定義(
那么要如何判斷一個關系模式是幾范式呢?
背景
現(xiàn)在給出關系模式和函數(shù)依賴(functional dependency,簡稱FD)集,判斷關系模式的所屬范式
方法
概括
抽象,所以看例子
例七:判斷下述依賴集是什么范式
E
x
a
m
p
l
e
:
G
i
v
e
n
R
<
U
,
F
>
,
R
=
{
B
,
C
,
D
,
E
,
G
,
H
}
,
F
=
{
B
C
D
→
E
G
H
,
E
→
D
,
G
→
C
}
Example:Given \R,R=\{B,C,D,E,G,H\},F=\{BCD\rightarrow EGH,E\rightarrow D,G\rightarrow C\}
Example:GivenR,R={B,C,D,E,G,H},F={BCD→EGH,E→D,G→C}
解:
求候選碼 B C D 、 B C E 、 B D G 、 B E G BCD、BCE、BDG、BEG BCD、BCE、BDG、BEG,可得主屬性 B 、 C 、 D 、 E 、 G B、C、D、E、G B、C、D、E、G,非主屬性 H H H
可得非平凡FD: E → D , G → C E\rightarrow D,G\rightarrow C E→D,G→C,所以不是BCNF
又因為非平凡FD的右邊屬性都是主屬性,所以是3NF
例八:判斷下述依賴集是什么范式
E
x
a
m
p
l
e
:
G
i
v
e
n
R
<
U
,
F
>
,
R
=
{
A
,
B
,
C
,
D
}
,
F
=
{
A
B
→
C
,
C
→
D
}
Example:Given \R,R=\{A,B,C,D\},F=\{AB\rightarrow C,C\rightarrow D\}
Example:GivenR,R={A,B,C,D},F={AB→C,C→D}
求候選碼
A
B
AB
AB,可得主屬性
A
、
B
A、B
A、B,非主屬性
C
、
D
C、D
C、D
可得非平凡FD: C → D C\rightarrow D C→D,所以不是BCNF
又因為非平凡FD的右邊屬性不是主屬性,所以不是3NF
接下來判斷是否為2NF。根據(jù)定義,2NF不存在非主屬性對碼的部分依賴(關于部份依賴,詳見平凡依賴,非平凡依賴,完全依賴,部分依賴,傳遞依賴,直接依賴的區(qū)別 )。所以我們先構造完整依賴,判斷依賴函數(shù)是否存在冗余屬性,如果有就說明不滿足不存在部份依賴,不為2NF。
只能對此題。構造非主屬性對候選碼的完整依賴 A B → C , A B → D AB\rightarrow C,AB\rightarrow D AB→C,AB→D,判斷冗余屬性(最小依賴集是不是用過呢?),可得兩個依賴函數(shù)都沒有冗余屬性,即不存在非主屬性對候選碼的部份依賴,都是完全依賴,即符合2NF。
參考求最小依賴集方法
數(shù)據(jù)庫規(guī)范化理論大題考點
如何判斷范式(1NF、2NF、3NF、BCNF)
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧