数据库系统概念实践习题部分答案(未必翻译完全)

数据库设计和E-R模型

为车辆保险公司构建一个E-R图,它的每个客户有一辆或多辆车,每辆车关联零次或任意次视图的记录。每张保险单为一辆或多辆车保险,并与一个或多个保费支付相关联。每次支付只针对一个特定的事件,具有关联的到期日和缴费日。

答:

在这里插入图片描述

考虑一个用于记录学生在不同开课(section)的不同考试中所得成绩的数据库

1.为数据库构造一个E-R图,其中,将考试建模为实体并使用一个三元联系。

2.构造另一个E-R图,其中,只用students和section间的二元联系。保证在特定students和section对之间只存在一个联系,而且你可以表示出学生在不同考试中所得成绩。

在这里插入图片描述

设计一个E-R图用于跟踪记录你最喜欢的球队的成绩。你应该保存打过的比赛,每场比赛的比分,每场比赛的上场队员以及每个队员在每场比赛中的统计数据。总的统计数据应该被建模成派生属性。(不是基本属性而是可以被计算出的属性)

在这里插入图片描述

考虑一个E-R图,相同的实体集出现数次,且它的属性重复出现多次。为什么这样的冗余是应精良避免的不良设计?

答:因为这样容易出现不一致错误。

E-R图可视为一个图,下面这些术语对于一个企业模式的结构意味着什么?

1.图是非连通的。2.图是有环的。

答:1.如果一对实体集中有路径的存在,那怕是间接的,我们也说它们是相连。在一个企业模式中,如果图是非连通的,则代表这两个部分是完全独立的。

2.有环的至少两个实体集之间就有多种方面的相互关联,而无环每一对实体集之间的路径就只有一个独特的关系。

一个弱实体集总可以通过往自己的属性中加入其标识实体集的主码属性而变成一个强实体集。概括一下如果我们这么做会产生怎样的冗余?

答:弱实体集的主键可以从它与强实体集的关系得到。如果我们添加主键属性
到弱实体集,它们将同时存在于实体集和关系集,而且它们将会是是相同的。因此,会有冗余。

考虑一个关系,例如sec_course,产生于多对一的联系sec_course。在这个关系上创建的主码约束和外码约束是否强制实施多对一的基数约束?为什么。

在这里插入图片描述

答:在这个例子中,section的主键由course_id、sec_id、semester、year组成,这也是sec_course的主键,而course_id是sec_course的外键,这些约束保证了一节课只能对应于一门课程,因此多对一的基数约束是被保证了的,但是全参与约束不能保证。

假设advisor联系是一对一的。为了确保执行一对一基数约束,在关系advisor上需要哪些额外的约束?

答:除了声明s_ID为advisor的主键外,我们还声明i_ID为advisor的超码,这可以在SQL中对i_ID使用unique约束来实现。

考虑实体集A和B之间多对一联系R,假设从R生成的关系和A生成的关系合并了。在SQL中,参与外码约束的属性可以为空。解释如何使用SQL上的not null约束来强制实施A在R中的全部参与约束。

答:首先R中的外键B应该是not null,这样确保A中没有元组在R中但是没有联系上B中任何的值。例如a是A中的一个没有在R中的元组,这表示当A和R合并的时候,对应的联系B的外键是null,这是不被允许的。

在SQL中,外码约束只能参照被参照关系上的主码属性,或者其他用unique约束声明为超码的属性。这导致多对多联系(或者一对多联系的“一”方)上的全部参与约束在从该联系创建的关系上无法用关系上的主码、外码以及非空约束强制实施。1.解释一下为什么2.解释如果使用复杂check或者断言来强制实时全部参与约束。

答:1.因为无论是多对多联系还是一对多联系的"一"方,联系集和实体集都无法合并。SQL目前没有办法去保证存在实体集的主键的一个值在多对多联系集上也同样出现,对于一对多联系的“一”那方也是如此。

2.Let the relation R be many-to-one from entity A to entity B with a and b as their respective primary keys, repectively. We can put the following check constraints on the “one” side relation B:

constraint total_ part check (b in (select b from A));

set constraints total_part deferred;

Note that the constraint should be set to deferred so that it is only checked at the end of the transaction; otherwise if we insert a b value in B before it is inserted in Athe above constraint would be violated, and if we insert it in Abefore we insert it in B, a foreign key violation would occur.

事务管理

假设永远存在不出现故障的数据库系统,对这样的系统还需要故障恢复管理器吗?

答:即便如此,故障恢复管理器也需要执行回滚中止的事务。

数据库系统实现者比文件系统实现者更注意ACID特性,为什么?

答:数据库系统通常需要原子性和持久性,其结果以永久的方式影响现实。如货币交易、座位预定等,因此需要确保ACID属性。相比之下,大多数文件系统不会愿意为时间空间的支持性付出代价。

为什么必须从慢速磁盘获取数据或者执行长事务时,事务的并发执行更为重要,而当数据存在于主存且事务非常短时,没那么重要。

答:如果须从慢速磁盘获取数据或者执行长事务,在没有并发的情况下,其他食物需要等待更长的时间,平均响应时间也会增加,然而CPU相对空闲。因此,资源没有得到适当利用。因此在这种情况下,事务的并发执行很重要,而数据存在于主存且事务非常短时,则没有这种问题。

既然每一个冲突可串行化调度都是视图可串行化,我们为什么要强调冲突可串行化而非视图可串行化?

答:因为视图可串行化因为其计算的高度复杂性在实际中并不常用,因为属于NP完全问题,几乎不存在有效的判定视图可串行化的算法。

考虑下方的优先图,相应的调度是冲突可串行化吗?解释回答

在这里插入图片描述

答:是,因为优先图没有环,可以根据优先图做拓扑排序,得到一个序列T1,T2,T3,T4,T5。

什么是无级联调度?为什么要求无级联调度?是否存在要求允许级联调度的情况?

答:对于每对视图Ti和Tj,如果Tj读取了先前由Ti所写的数据项,则Ti必须在Tj这一读操作前提交,每一个无级联调度也是可恢复调度。要求无级联调度是为了不让单个事务故障导致一系列事务回滚(级联回滚),代价就是并发减少。当然,如果故障很少发生,那我们就可以使用级联调度,代价就是增加并发量。

重看14.8

考虑一个采用快照隔离的航空公司数据库,描述一个出现非可串行化调度但是航空公司为了更好的整体性能而愿意接收的特定场景。
在这里插入图片描述

一个调度的定义假设操作可以完全按时间顺序排列。考虑一个运行在多处理器系统上的数据库系统,它并不总是能对于运行在不同处理器上的操作确定一个准确的顺序,但是一个数据项上的操作全部可以排序。以上情况是否对冲突可串行化的定义造成问题,请解释。

答:上述的情况不会对冲突可串行化造成任何问题,因为知道每个数据项的操作顺序是冲突可串行化所必需的,对于不同的数据项则并不重要。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值