数据库原理闭包、范式和求最小函数依赖集的例题
闭包
-
已知关系模式R(A,B,C),F是R上成立的FD集,F={A→B,B→C}, F的闭包F+有多少个?试写出(AB)+的所有闭包。
解:
根据已知条件和推理规则,可知F+有43个函数依赖。各种情况如下:
答:F的闭包F+有43个;(AB)的闭包(AB)+ =ABC -
设关系R(ABCDE)上FD集为F,并且F={A→BC,CD→E,B→D,E→A}。求出R的所有候选键。
解:A+=ABCDE B+=BD C+=C D+=D E+=EABCD 候选码有A、E。
对剩下的B 、C、D进行组合:
可以求出:BC+=ABCDE BD+=BD CD+=ABCDE
BC、CD也为候选码
所以R的候选键有四个:A、E、BC和CD。 -
R<U,F>,
U={A,B,C,D,E,G}
F{AB→C,D→EG,C→A,BE→C,BC→D,CG→BD,ACD→B,CE→AG}
X=BD,求X+,并判断BD->A是否成立?
解:
因为X=BD 所以X+=(BD)+;
因为D→EG
所以BD→BDEG
因为BE→C
所以BD→BCDEG
因为C→A
所以BD→ABCDEG
所以(BD)+=ABCDEG
所以 X+=ABCDEG
因为(BD)+=ABCDEG,A属于(BD)+
所以BD->A是成立的。
范式
- 给定一个学校的学生选课系统,为了方便起见,我们只确定了以下需要的内容:
R(学号、学生姓名、年龄、性别、课程名称、课程学分、系别、学科成绩、系办地址、系办电话)
首先判断它是几范式?如何把它规范化成3NF?
解:
范式首先要找主码:(学号,课程名称)
学号单独决定学生姓名,所以学生姓名就是部分函数依赖于主码
所以R是1NF(第一范式)
拆成2NF(消除部分函数依赖):
R1(学号、学生姓名、年龄、性别、系别、系办地址、系办电话)
R2(学号、课程名称、课程学分、学科成绩)
在R1中,存在学号→系别→系办地址,传递函数依赖(非第三范式)
拆成3NF(消除传递函数依赖):
R11(学号、学生姓名、年龄、性别、系别)
R12(系别、系办地址、系办电话)
R2(学号、课程名称、课程学分、学科成绩)
求最小函数依赖集
- 给定关系模式R(A,B,C) F={A->BC,B->AC,C->A} 求F的最小函数依赖集。
解:
(1)将F中的函数依赖进行拆分:
F={A->B,A->C,B->A,B->C,C->A}
(2)假设A->B冗余(去掉A->B)
剩下:F={A->C,B->A,B->C,C->A}
A+=AC
但是B不属于AC,也就是不属于A的闭包,留下
(3)假设A->C冗余
剩下:F={A->B,B->A,B->C,C->A}
A+=ABC
C属于A的闭包,所以删除
(4)删除后F={A->B,B->A,B->C,C->A}
假设B->A冗余
F={A->B,B->C,C->A}
B+=ABC 删除
(5)删除后F={A->B,B->C,C->A}
假设B->C冗余
F={A->B,C->A}
B+=B 留下
(6)假设C->A冗余
F={A->B,B->C}
C+=C A不属于C的闭包 留下
所以F的最小函数依赖集为:{A->B,B->C,C->A}