数据库理论第八章习题
8.2
列出所示关系满足的函数依赖
A | B | C |
---|---|---|
a1 | b1 | c1 |
a1 | b1 | c2 |
a2 | b1 | c1 |
a2 | b1 | c3 |
答:
平凡的依赖关系有19种,类型均如由于β∈α,故α->β。
单属性的:A->A,B->B,C->C;
双属性的:AB->A,AB->B,AB->AB;AC->A,AC->C,AC->AC;BC->B,BC->C,BC->BC
三属性的:ABC->A,ABC->B,ABC->C,ABC->AB,ABC->BC,ABC->AC,ABC->ABC;
非平凡的依赖关系如下,有3种:
A->B:因为对于A中元素,相同的元素均对应于B中相应的元素
C->B:对于C中相同元素均对应于B中相同元素
AC->B:可由上述两项推出
由于B中所有元素属性相同而A和C中均存在不同元素,故不存在B到非B的函数依赖
由于相同的A在c中有不同的映射,故A->C不成立;C->A同理不成立。
8.3
解释如何用函数依赖表明:
- 实体集student和instructor间存在的一对一联系集
- 实体集student和instructor间存在的多对一联系集
答:
- primarykey(student)->primarykey(instructor)和primarykey(instructor)->primarykey(student)表示实体集student和instructor间的一对一联系集,表示对于student集中对学生具有相同值的元组映射到instuctor中必定有相同的instructor主码值,对于instructor中对教员具有相同值的元组映射到student中必定有相同的student主码。
- primarykey(student)->primarykey(instructor)的多对一联系集表示的是对于相同的student主码值必定对应于相同的instructor主码值,与一对一关系不同的是不同的学生可能对应于同一个instructor。
8.9
给定数据库模式R(a,b,c)及模式R上的关系r,写出检验函数依赖b->c是否在关系r上成立的SQL查询。并写出保证函数依赖的SQL断言。假设不存在空值。
答:检验b->c是否成立也就是指对于相同的b不能映射到不同的c:
select b
from r
group by b --通过b进行分类
having count(distinct c) > 1 --查看相同的b映射到c的种类是否大于1
--如果最终b是空集,则说明该函数依赖成立,否则说明不成立
断言检验也利用上述的结果进行判断,如果不为空则产生断言:
create assertion func_b_c check
(
not exists (select b --用not exists进行判定
from r
group by b
having count(distinct c) > 1)
)