实践习题
2.1 考虑图2-14所示关系数据库。这些关系上适当的主码是什么?
Ans:
如图2.1中带下划线的码。(emmmm,发现答案不是很靠谱。比如员工的名字有重名的现象,显然name不能作为主码。但其实name+street+city也可能会有碰巧一样的情况。所以严格来说,这几张表的结构不是很好,项目中最好还是用id作为主键会比较好。)
2.2 考虑从instructor的dept_name属性到department关系的外码约束,给出对这些关系的插入和删除示例,使得他们破坏外码约束。
Ans: a. 往instuctor表中插入一个元组:(10111, Ostrom, Economucs,
110,000),而department表中没有Economics这个院系。这会破坏外码约束。
b. 从depaerment表中删除一个元组:(Bioology, Watson, 90000),
而至少有一个学生或者教员元组的depart_name是Biology。这会破坏外码约束。
2.3
考虑time_slot关系。假设一个特定的时间段可以在一周之内出现多次,解释为什么day和start_time是该关系主码的一部分,而end_time却不是。
Ans:
day和start_time属性是主码的一部分是因为很有可能在不同的日期甚至是同一天内多次遇到一个特定的类,而end_time不是是因为在特定时间开始的类不可能多次结束。(啥意思呢?表在P24下面,我们来推测一波。当这个时间段出现在多天的时候,显然day是可以区分不同的元组的;而在一天中的多个元组,我们既可以通过start_time其实也可以通过end_time来区分(这里不考虑同时发生同时结束的情况)。那么题目的意思很可能是问为什么day+其中一个time就可以作为主码,但一个time是不能作为主码的原因吧)
2.4 在图2-1所示的instructor的势力中,没有两位教师同名。我们是否可以据此断定name可用来作为instructor的超码(或主码)?
Ans: 不行。因为这个教员表的例子比较特殊,普遍情况下不这样(除非这个学校规定两个教员不能用一样的名字,不过这不太可能)。
2.5
先执行student和advisor的笛卡儿积,然后再结果上执行基于谓词s_id=ID的选择运算,最后的结果是什么?(采用关系代数的符号表示,此查询可写作σs_id=ID(student
x advisor)。)
Ans:
结果属性包含了所有student的属性,后面跟着所有advisor的所有属性(如图)。结果中的元组如下, 对于拥有advisor的每个student,结果都有一行包含学生属性,后跟一个与学生ID属性相同的s_id属性,后跟包含学生顾问ID的i_id属性。没有advisor的studnet将不会出现在结果中。
拥有多个顾问的学生将在结果中显示相应的次数。
2.6 考虑下面的表达式,哪些使用了关系代数运算的结果来作为另一个运算的输入?对于每个表达式,说明表达式的含义。
a. (σyear>=2009(takes) ⋈ advisor)
b. (σyear>=2009(takes)⋈ student)
c. ∏ID,name,course_id(student⋈takes)
Ans: a. 对于那些在2009年至少选了一门课的学生,把学生信息和所选课程信息一同展示,结果属性如下:
ID, Name, dept_name, tot_cred, course_id, section_id, semester, year, grade
b. 和a一样;选择可在join操作之前完成
c. 只要选了课的学生都会出现在有ID, name, course_id属性的表中。
2.7 考虑图2-14所示关系数据库。给出关系代数表达式来表示下列每一个查询:
a. 找出居住在"Miami"城市的所有员工信息。
b. 找出工资在100000美元以上的所有员工姓名。
c. 找出居住在"Miami"并且工资在100000美元以上的所有员工姓名。
Ans:
2.8 考虑图2-15所示银行数据库。对于下列每个查询,给出一个关系代数表达式:
a. 找出位于"Chicago"的所有支行名字。
b. 找出在支行"Downtown"有贷款的所有贷款人姓名.
Ans:
习题
2.9 考虑图2-15所示银行数据库。
a. 适当的主码是什么?
b. 给出你选择的主码,确定适当的外码。
Ans:a.
emmm...这样吧,字体加粗的作为主码,加下划线的作为外码吧(当然了,本题也不考虑几个键都相同的情况好吧,考虑最理想化的情况。当然每个人的思量都不一样,考虑不一样结果也不一样)
branch(branch_name, branch_city, assets)()
customer(customer_name, customer_street, customer_city)
loan(loan_number, branch_name, amount)
borrower(customer_name, loan_number)
account(account_number, branch_name, balance)
depositor(customer_name, account_number)
2.10
考虑图2-8所示advisor关系,advisor的主码是s_id。假设一个学生可以有多位指导老师。那么,s_id还是advisor关系的主码吗?如果不是,advisor的主码会是什么呢?
Ans: emmmm? s_id是student_id的意思?如果是这样那不行!如果是老师的id,那肯定是可以的。题目没说清楚,所以无从知道。
2.11 解释术语关系和关系模式在意义上的区别。
Ans: 关系的概念对应于程序设计语言中变量的概念,而关系模式的概念对应于程序设计语言中类型定义的概念(书上原话)。
2.12 考虑图2-14所示关系数据库。给出关系代数表达式来表示下列每一个查询:
a. 找出为"First Bank Corporation"工作的所有员工姓名。
b. 找出为"First Bank Corporation"工作的所有员工的姓名和居住城市。
c. 找出为"First Bank Corporation"工作且挣钱超过10000美元的所有员工的姓名、街道地址和居住城市。
Ans: a. ∏person_name(σcompany_name=First Bank Corporation(employee⋈works))
b. ∏person_name,city(σcompany_name=First Bank Corporation(employee⋈works))
c. ∏person_name,street,city(σcompany_name="First Bank
Corporation"(employee⋈works) ∪σsalary>=10000(employee⋈works))
2.13 考虑图2-15所示银行数据库。对于下列每个查询,给出一个关系代数表达式:
a. 找出贷款额度超过10000美元的所有贷款号。
b. 找出所有这样的存款人姓名,它拥有一个存款额大于6000美元的账户。
c. 找出所有这样的存款人姓名,他在"Uptown"支行拥有一个存款额大于6000美元的账户。
Ans: a. ∏loan_number(σamount>10000(loan))
b. ∏customer_name(σbalance>6000(account⋈depositor))
c. ∏customer_name(σbalance>6000(account⋈depositor)∪σbranch_name="Uptown"(account⋈depositor))(这个可能可以化简?)
2.14 列出在数据库中引入空值的两个原因。
Ans: a. 数据库中某个属性不存在(比如说存在学生没有手机号码的情况);
b. 数据库中某个属性未提供或未知(比如说有些人填写了性别而有些人出于隐私考虑不填);
2.15 讨论过程话和非过程化语言的相对优点
Ans:
在过程化语言中,用户指导系统对数据库进行一系列操作以计算出所需结果。在非过程化语言中,用户只需描述所需信息,而不用给出获取该信息的具体过程。因此我们可以看出,过程化语言的运行速度肯定比非过程化语言要来得快,但是过程化语言太过繁琐,用户体验不行;非过程化语言简单方便,但是牺牲了运行速度。各有优缺吧~
热门工具 换一换