DBa作业

1.假设关系R(A, B)和S(B, C, D)情况如下: R有20000个元组,S有1 200个元组,一个块能装40个R的元组,能装30个S的元组,估算下列操作需要多少次磁盘块读写。

(1) R上没有索引,sclect* from R;
总块数 = 元组数 / 每块容量 = 20000 / 40 = 500块(因为没有索引,需要扫描整个表)
磁盘块读写次数:500次(读取所有块)
(2) R中A为主码,A有3层B+树索引,select * from R whereA=10; !!!!!
B+树索引的层数为3,查找一个特定值需要访问索引的3个块。
找到目标元组后,需要再访问数据块。
假设每个主码值对应一个元组,则只需访问1个数据块。
磁盘块读写次数:3(索引块) + 1(数据块) = 4次。
(3)嵌套循环连接R∞S;
如果外层循环是S,内层循环是R:每次读取S的一个块,需要读取R的所有块。
总读写次数 = |S| × (|R| / 每块容量) = 1200 × 500 = 600,000次。
(4)排序合并连接R∞S,区分R与S在B属性上已经有序和无序两种情况。!!!!!
如果R和S在B属性上无序:排序R需要2次扫描(读取和写回),每次扫描需要500块,共2 × 500 = 1000次。排序S需要2次扫描,每次扫描需要40块,共2 × 40 = 80次。合并阶段需要一次扫描,读取R和S的块,共500 + 40 = 540次。总读写次数 = 1000 + 80 + 540 = 1620次。
如果R和S已经在B属性上有序:只需合并阶段,读取R和S的块,共500 + 40 = 540次。

2.对学生课程数据库,查询信息系学生选修了的所有课程名称。

select Cname
from Student, Course, sc
where Student Sno-SC.Sno and SC.Cno=Course.Cno and Student.Sdept = ‘IS’:
试画出用关系代数表示的语法树,并用关系代数表达式优化算法对原始的语法树进行优化处理,画出优化后的标准语法树。
在这里插入图片描述

3. 对于下面的数据库模式:

Teacher(Tno,​ ,Tname,Tage,Tsex);
Department(Dno, ,Dname,Tno);
Work(Tno, ,Dno,Year,Salary);
假设Teacher的Tno属性,Department的Dno属性以及Work的Year属性上有B+树索引,说明下列查询语句的一种较优的处理方法。
(1)select * from Teacher where Tsex=‘女’;
在Tsex上建立索引以加速查询
(2)select * from Department where Dno<301;
使用B+树索引进行范围查询(Dno上有B+树索引)
(3)select * from Work where Year<>2000;
分别查询Year < 2000和Year > 2000,然后合并结果(Year上有B+树索引,条件<>无法直接利用索引)
(4)select * from Work where Year>2000 and Salary<5000;
在Year和Salary上建立联合索引(单独使用效率低)
(5)select * from Work where Year<2000 or Salary<5000;
分别查询Year < 2000和Salary < 5000,然后合并结果(此条件OR无法直接利用索引)

4.对于第3题中的数据库模式,有如下的查询:

seleet Tname
from teacher, department, work
where teacher.tno = work tno and department.dno = work.dno and
department. dname = ‘计算机系’ and salary> 5000
画出语法树以及用关系代数表示的语法树,并对关系代数语法树进行优化,画出优化后的语法树。
在这里插入图片描述

5.关系模式R(A,B,C,D,E,F),F={A->B, A->C, D->E, (A,D)->F}

(1)按照BCNF分解算法,分解为BCBF
(2)按照三范式保函分解算法,保函分解为3NF;
(3) 按照三范式无损保函分解算法,无损保函分解为3NF;
注:要写出详细的分解过程!
(1) BCNF分解
第一步:确定候选键,根据给定关系模式:R(A, B, C, D, E, F)和函数依赖集:F = {A → B, A → C, D → E, (A, D) → F},来找出候选键(能够唯一标识元组的最小属性集合)。
从函数依赖集中可以看出:
A可以决定B和C(通过A → B和A → C);D可以决定E(通过D → E);(A, D)可以决定F(通过(A, D) → F)。
因此,(A, D)可以决定所有其他属性(B、C、E、F),而单独的A或D都不能做到这一点。
所以,候选键为:(A, D)
第二步:检查是否符合BCNF
BCNF要求:对于每个非平凡的函数依赖X → Y,X必须是超键!!!!!
检查给定的函数依赖集:
A → B:A不是超键(因为A不能决定所有属性),不符合BCNF。
A → C:A不是超键,不符合BCNF。
D → E:D不是超键,不符合BCNF。
(A, D) → F:(A, D)是超键,符合BCNF。
第三步:分解以满足BCNF
为了满足BCNF,我们需要对不符合BCNF的依赖进行分解。

处理A → B 和 A → C:将A与其决定的属性B和C提取出来,形成一个新的关系模式R1(A, B, C),剩下的属性和依赖为R2(A, D, E, F),其依赖集为{D → E, (A, D) → F}。
处理D → E:在R2中,D → E不满足BCNF(因为D不是超键),将D与其决定的属性E提取出来,形成一个新的关系模式R2_1(D, E),剩下的属性和依赖为R2_2(A, D, F),其依赖集为{(A, D) → F}。
第四步:验证三个关系模式:
R1(A, B, C):包含依赖{A → B, A → C},且A是超键。
R2_1(D, E):包含依赖{D → E},且D是超键。
R2_2(A, D, F):包含依赖{(A, D) → F},且(A, D)是超键。
分解结果:R1(A, B, C) R2_1(D, E) R2_2(A, D, F)
(2) 按照三范式保函分解算法,保函分解为3NF
第一步:找到最小覆盖集Fmin
原始依赖集F = {A → B, A → C, D → E, (A, D) → F}已经是最小覆盖集,无需化简。
第二步:创建子模式
根据每个函数依赖创建一个子模式,并确保至少有一个子模式包含候选键(A, D)。
基于A → B:创建子模式S1(A, B)
基于A → C:创建子模式S2(A, C)
基于D → E:创建子模式S3(D, E)
基于(A, D) → F:创建子模式S4(A, D, F),并包含候选键(A, D)。
第三步:验证四个关系模式:
S1(A, B) S2(A, C) S3(D, E) S4(A, D, F)
这些子模式保留了所有的函数依赖,并且至少有一个子模式包含候选键(A, D)。

(3) 按照三范式无损保函分解算法,无损保函分解为3NF
第一步:保持函数依赖
按照3NF保函分解的结果,我们已经有以下子模式:T1(A, B) T2(A, C) T3(D, E) T4(A, D, F)
这些子模式保留了所有的函数依赖。
第二步:确保无损连接
确保分解后的关系模式包含候选键(A, D)。观察分解结果:子模式T4(A, D, F)已经包含了候选键(A, D)。因此,该分解既是无损的,又保持了所有的函数依赖。
第三步:验证分解结果
最终分解为以下四个关系模式:T1(A, B) T2(A, C) T3(D, E) T4(A, D, F)

小结

在完成BCNF分解的过程中,我体会到了“拆解问题”的重要性。比如,在处理不满足BCNF条件的函数依赖时,不能急于求成,而是要一个一个依赖来检查,找出它们违反BCNF的原因,再决定如何将原关系合理地分解。

而在3NF的保函分解和无损保函分解中,我学会了如何在保持函数依赖的同时,确保分解后的模式能够准确还原原始数据。特别是当我知道只要有一个子模式包含候选键就可以实现无损连接时,我才真正理解了候选键在整个数据库设计中的核心地位——它不仅是识别元组的唯一标识,更是保证数据完整性和一致性的关键所在。

通过这次作业,我也意识到自己在某些概念的理解上还存在模糊的地方,比如对“最小覆盖集”、“保函”、“无损连接”的具体含义和判断方法,一开始掌握得并不牢固。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值