十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在网上看了许多有关数据库函数依赖考题的分析,大都信息不全或者讲不完整,甚至是胡言乱语,看的我也是云里雾里。在浅浅的了解一番之后,决定总结一下有关这方面的做题技巧,为了加深印象也为了应付考试,于是就有了这篇文章。
阅读须知:数据库函数依赖的部分概念非常多,也十分难理解,如果单纯看书那会发现根本看不懂(比如我,书上各式各样的符号解释让人眼花缭乱)。所以本文大都以例子来说明,碰到相关概念再展开定义。
属性集的闭包令 α \alpha α 是一个属性集,我们将函数依赖集 F F F 下被函数确定的所有属性的集合称为 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}
很简单,只要根据函数依赖集一步步推到就可以得到,首先是闭包初始状态
B
C
BC
BC,接着分别考虑每一个状态,根据依赖
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 也加入到闭包当中。当刚求出的属性闭包与上一个闭包相同时或者已经求出了所有的属性
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}
有了上面的经验,这个是不是很简单了呢?
解:
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)+
可能还是过于抽象,直接看题。还是上面的例二,问函数依赖 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}
解:
第一步右部化为单属性,经过分解后上述依赖集就变成如下依赖集:
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}
第二步判断依赖是否可以去除。把依赖集中的每一个依赖一个个尝试,看把这个依赖去掉后,还能不能导出这个依赖关系,如果能,则依赖多余要去除;如果不能,则保留。如果看能不能导出依赖关系呢?就要用到我们上述判断函数依赖是否成立了,其实就是判断依赖式左边的闭包包不包含右边。
举例,把 A → C A\rightarrow C A→C 去掉(已经去掉了,此依赖就不可用了),就看 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,也就说明没有这个依赖,此依赖也可以得到,所以把它去掉。再继续判断下一个直到最后,需要注意的是,此时 A B → C AB\rightarrow C AB→C 已经去掉,之后的判断过程就不可再用此依赖了。
最后我们得到依赖集:
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 左部已经是单属性,就不考虑。直接看第三个
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}
整个求解过程较为繁琐。需要注意的是第二步和第三步的细微区别。第二步判断依赖是要先把依赖删除,再利用其他的依赖关系看看能不能推出来此依赖,而第三步判断冗余属性时原本的依赖式是全部可用的。
再看一个例子吧。
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}
解:
第一步右部化为单属性,经过分解后上述依赖集就变成如下依赖集:
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}
第二步判断是否有多余依赖式。可以发现式子
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}
解:
前面还是按照求解最小依赖集的方式。
第一步右部化为单属性,经过分解后上述依赖集就变成如下依赖集:
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}
第二步判断是否有多余依赖式。可以发现式子
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}
根据正则覆盖的定义,需要把
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}
解:
首先看从未再依赖式右部出现的属性为 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 不是候选码。
此时就不用添加属性了,因为已经是长度最小了。所以此依赖集的候选码集合就是 { A B , A C } \{AB,AC\} {AB,AC}
判断范式1NF、2NF、3NF、BCNF的概念书上都有,不做过多解释了,我自己也看不懂那个杀软定义(
那么要如何判断一个关系模式是几范式呢?
背景
现在给出关系模式和函数依赖(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。根据定义,2NF不存在非主属性对码的部分依赖(关于部份依赖,详见平凡依赖,非平凡依赖,完全依赖,部分依赖,传递依赖,直接依赖的区别 )。所以我们先构造完整依赖,判断依赖函数是否存在冗余属性,如果有就说明不满足不存在部份依赖,不为2NF。
只能对此题。构造非主属性对候选码的完整依赖 A B → C , A B → D AB\rightarrow C,AB\rightarrow D AB→C,AB→D,判断冗余属性(最小依赖集是不是用过呢?),可得两个依赖函数都没有冗余属性,即不存在非主属性对候选码的部份依赖,都是完全依赖,即符合2NF。
参考求最小依赖集方法
数据库规范化理论大题考点
如何判断范式(1NF、2NF、3NF、BCNF)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧