数据结构DB课后题部分答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P175:
5. 设有关系模式R(A,B,C,D),函数依赖F={A→C, C→A, B→AC, D→AC,BD→A }
1)求R的所有候选键。
2)求出F的最小函数依赖集Fmin。
3)根据函数依赖关系,确定关系模式R属于第几范式。
4)将R分解为3NF,并保持无损连接性和函数依赖性。
答:1)属性分类为:
L类:B,D ; LR类:A,C; R类:无; N类:无
因为(BD)+=ABCD ,所以BD是唯一候选键.
2)
●函数依赖F={A→C, C→A, B→AC, D→AC, BD→A }右部分解为单属性为
F={A→C, C→A, B→A, B→C, D→A, D→C, BD→A }
●因为B+=ABC,所欲BD→A,D为左部多余的属性.将D去掉,则
F={A→C, C→A, B→A, B→C, D→A, D→C }
●冗余函数依赖: 因为B+=ABC,所以B→A多余,去掉.
因为D+=ACD,所以D→A多余,去掉.
所以Fmin={A→C, C→A, B→C, D→C }
4)根据算法4.6,以及Fmin,F中没有X→Y,XY=R的函数依赖,也没有属性在F的函数依赖中左右都无关。所以将Fmin中的各个函数依赖单独构成一个关系模式,
对于Fmin中每一个函数依赖:
A→C:表中数据不改变;
C→A:将A中所有b给为a1;
表中没有都是a的行,所以不是无损连接的。
因此根据算法 4.7,将候选键作为一个关系模式加入到ρ中,所以结果为ρ={AC,BC,DC,BD}
6.设有关系模式R(A,B,C,D),函数依赖F={A→C, C→A, B→AC, D→AC }
1)求(AD)+,B+。
2)求出R 的所有候选键。
3)求出F的最小函数依赖集Fmin。
4)根据函数依赖关系,确定关系模式R属于第几范式。
5)将R分解为3NF,并保持无损连接性和函数依赖性
6)略
答:
1) (AD)+=ACD, B+=ABC
2) 属性分类为:
L类:B,D ; LR类:A,C; R类:无; N类:无
因为(BD)+=ABCD ,所以BD是唯一候选键.
3)(1)函数依赖F={A→C, C→A, B→AC, D→AC }右部分解为单属性为
F={A→C, C→A, B→A, B→C, D→A, D→C }
(2)无左部多余的属性.
(3)冗余函数依赖: 因为B+=ABC,所以B→A多余,去掉.
因为D+=ACD,所以D→A多余,去掉.
所以Fmin={A→C, C→A, B→C, D→C }
4)首先R是1NF,因为BD为候选码,另B→C , BD→C,所以,存在非主属性对码的
部分函数依赖,所以R是1NF,不是2NF.
5)同第5题。
8.判断关系模式是否保持无损连接性。-分析方法同第5题中的(4)
(1)
分析……
所以没有全是a的行,所以不保持无损连接。
注意:Y→U,将U列的b31修改为b21后,U列将出现相等的行,所以需要重新对Fmin中的所有函数依赖再进行一次数据修改。直到不能修改为止。
(3)
修改后的表格数据为:
所以没有全是a的行,所以不保持无损连接。
P176:
17题:求Fmin,
●函数依赖F={ E→G,G→E, F→EG, H→EG, FH→E }右部分解为单属性为
F={ E→G,G→E, F→E, F→G,H→E,H→G, FH→E }
●对于FH→E,因为H+=HEG,所以FH→E,F为左部多余的属性.将F去掉,
则F={ E→G,G→E, F→E, F→G,H→E,H→G}
●冗余函数依赖: 因为对F→E ,F+=FGE,所以F→E多余,去掉.
因为H→E ,H+=HGE,所以H→E多余,去掉.
所以Fmin={ E→G,G→E, F→G ,H→G }
18题:(1)求所有候选键
属性分类为:
L类:C, E ; LR类:A, R类:B,D,P; N类:无
因为(CE)+=CEPDAB ,所以CE是唯一候选键.
P298页:存储过程和触发器
4.自定义存储过程
(1)CREATE PROCEDURE Insert_Student(
@s_no char(6),
@class_no char(6),
@s_name varchar(10),
@s_sex char(2),
@s_birthday datetime)
as insert into student(s_no,class_no,s_name,s_sex,s_birthday)
values(@s_no,@class_no,@s_name,@s_sex,@s_birthday)
(2)EXEC Insert_Student @s_no=’123456’, @class_no=’js9901’,@s_name=’张三’,@s_sex=’男’,@s_birthday=’1981/01/02’
(3) CREATE PROCEDURE Insert_Course(
@ course_no char(6),
@ course_name char(20),
@ score numeric(6,2)=2
)
as insert into course (course_no, course_name, score)
values(@course_no, @course_name, @score)
(4) a:EXEC Insert_Course @course_no=’010001’, @course_name=’DB’, @score=4
b: EXEC Insert_Course @course_no=’010002’, @course_name=’VB’
(5) CREATE PROCEDURE Query_Student(
@ s_no char(6),
)
as select s_name,class_no,s_sex,s_birthday from student where s_no=@s_no
(6)EXEC Query_Student @s_no=’001101’
5 CREATE TRIGGER Display_trigger on student after insert as select * from student