.1 ?构建一个汽车保险公司的E-R图,其客户拥有一个或多个汽车。每辆汽车与零个或多个记录的事故相关联。每份保险单涵盖一辆或多辆汽车,并与一个或多个与之关联的保险费支付相关联。每次付款都是针对特定的时间段,具有关联的到期日和付款收到日期。.
Answer:
?
一个可能的E-R图如图6.101所示。由于付款与特定的保单相关联,因此将其建模为弱实体。
注意,事故在关系“参与”中的参与不是完全的,因为可能存在一个事故报告,其中参与的汽车是未知的。
6.2 考虑一个包含大学模式中的实体集合(student,course和section)的数据库,并额外记录学生在不同章节的不同考试中获得的分数。
a. 构建一个E-R图,将考试建模为实体,并在设计中使用一个三元关系。
b. 构建一个替代的E-R图,仅使用学生和章节之间的二元关系。确保一个特定的学生和章节对之间只存在一种关系,但你可以表示学生在不同考试中获得的分数。.
Answer:
a.?? ?E-R图如图6.102所示。请注意,一种替代方法是将考试建模为与部分相关的弱实体,而不是作为强实体。成绩关系然后将是学生和考试之间的二元关系,而不直接涉及章节。
?
b.?? ?E-R图如图6.103所示。请注意,在这里我们没有将考试的名称、地点和时间建模为关系属性的一部分。这样做会导致信息的重复,每个学生一次,而且我们将无法在没有相关学生的情况下记录这些信息。如果我们希望表示这些信息,我们需要保留一个与每次考试对应的单独实体。
?
6.3 ?设计一个用于跟踪你最喜欢的体育队比赛统计的E-R图。你应该存储已经进行的比赛,每场比赛的得分,每场比赛的球员,以及每场比赛的单个球员得分统计。
摘要统计应该被建模为派生属性,并解释它们是如何计算的。
Answer:
图6.104显示了该图。派生属性season score通过通过played关系集与球员实体集相关联的得分值求和来计算。
?
6.4 ?考虑一个E-R图,其中同一实体集出现多次,其属性在多个实例中重复。为什么允许这种冗余是一种不好的做法,应该避免??
Answer:
实体集出现多次的原因是如果绘制的图跨越多个页面。
实体集的不同实例可能具有不同的属性集,导致图表不一致。相反,实体集的属性应该只指定一次。实体的所有其他实例应省略属性。由于不可能没有任何属性的实体集,一个没有属性的实体集的实例明显表明属性在其他地方被指定。.
6.5?? ?一个实体-关系图可以被视为一个图。以下内容在企业架构结构方面是什么意思?
a. 图是不连通的。
b. 图中有一个环。.
Answer:
a. 如果在实体-关系图中存在一条路径连接一对实体集,那么这两个实体集是相关的,尽管可能是间接的。一个不连通的图意味着存在一些实体集对,它们彼此无关。在企业中,我们可以说企业的两个部分是完全独立的。如果我们将图分割为连通的组件,实际上就对应于企业每个独立部分的一个单独数据库.
b. 正如前一部分的答案所指出的,图中两个实体集之间的路径表示它们之间存在(可能是间接的)关系。如果图中存在一个环,那么环上的每一对实体集至少以两种不同的方式相互关联。如果实体-关系图是一个环路图,那么每一对实体集之间都存在唯一路径,因此每一对实体集之间都存在唯一关系。.
?
6.6 考虑使用图6.29b中所示的二元关系(不显示属性)来表示图6.29a的三元关系。
?
a. . 展示一个简单的 E、A、B、C、RA、RB 和 RC 的实例,它对应于 A、B、C 和 R 的任何实例。.
b. 修改图6.29b的 E-R 图,引入约束条件,确保满足这些约束条件的 E、A、B、C、RA、RB 和 RC 的任何实例都对应于 A、B、C 和 R 的一个实例.
c. 修改前述的翻译,以处理对三元关系的总参与约束。
Answer:
a. 让 E = {e1, e2},A = {a1, a2},B = {b1},C = {1},RA = {(e1, a1), (e2, a2)},RB = {(e1, b1)},以及 RC = {(e1, 1)}。由于元组 (e2, a2) 的存在,我们看到不存在与 E、RA、RB 和 RC 对应的 A、B、C 和 R 的任何实例。
b. 请参见图6.105。其思想是引入 E 与关系 RA、RB、RC 之间的总参与约束,以便 E 中的每个元组都与 A、B 和 C 有关系。
?
c. 假设 A 完全参与关系 R,那么引入 A 与 RA 之间的总参与约束,对于 B 和 C 也是类似的。
6.7 一个弱实体集总是可以通过将其属性添加到其识别实体集的主键属性中而变为强实体集。概述一下如果这样做会导致什么样的冗余。
Answer:
弱实体集的主键可以通过其与强实体集的关系推导出来。如果我们将主键属性添加到弱实体集中,它们将同时存在于实体集和关系集中,而且它们必须是相同的。因此会存在冗余。
6.8 考虑一个关系,如 se_section,由一个多对一关系集 se_course 生成。主键和外键约束在关系上创建,是否强制执行了多对一的基数约束?解释原因。
Answer:
在这个例子中,section 的主键由属性(course_id、section_id、semester、year)组成,这也将是 se_course 的主键,而 course_id 则是从 se_course 引用的外键。这些约束确保一个特定的 section 只能对应一个 course,因此多对一的基数约束得到了强制执行。
然而,这些约束无法强制执行总参与约束,因为一个 course 或一个 section 可能不参与 se_course 关系.
6.9 假设顾问关系集是一对一的。为确保一对一的基数约束生效,对顾问关系的关系需要添加哪些额外约束??
Answer:
除了将 s ID 声明为顾问的主键外,我们还声明 i ID 为顾问的超键(可以在 SQL 中使用 i ID 上的唯一约束来实现)。.
6.10 考虑实体集合 A 和 B 之间的多对一关系 R。假设由 R 生成的关系与由 A 生成的关系合并。在 SQL 中,参与外键约束的属性可以为 null。解释如何使用 SQL 中的 not null 约束强制执行 A 在 R 中的总参与度约束.
Answer:
与 B 的主键对应的 R 中的外键属性应该被设为 not null。这确保了在 R 下与 B 的任何条目无关的 A 的元组不会出现在 R 中。例如,假设 A 中的一个元组 a 没有对应的 R 条目,这意味着当 R 与 A 合并时,它将具有对应于 B 的外键属性为 null,这是不允许的.
6.11 ?在SQL中,外键仅能引用参考关系的主键属性或使用唯一约束声明为超键的其他属性。因此,无法通过在关系上使用主键、外键和非空约束来强制执行与关系集相关的多对多关系集(或一对多关系集的“一”侧)上的总参与约束。.
a.?? ?Explain why.
b.?? ?Explain how to enfor e total parti ipation onstraints using omplex
?he k onstraints or assertions (see Se tion 4.4.8). (Unfortunately, these features are not supported on any widely used database urrently.)
?
Answer:
a. 对于多对多情况,关系集必须表示为一个无法与任何参与实体合并的单独关系。在SQL中无法确保在实体E1中出现的主键值也出现在多对多关系R中,因为R中对应的属性不是唯一的;SQL外键只能引用主键或其他唯一键。类似地,对于一对多情况,由于相同的原因,无法确保一侧的属性出现在与多侧对应的关系中。
b. 让关系R从实体A到实体B是多对一的,它们分别具有a和b作为它们的主键。我们可以在“一”侧的关系B上设置以下检查约束:
sql
Copy code
CHECK (b IN (SELECT b FROM A));
SET CONSTRAINTS total_part CHECK deferred;
请注意,约束应设置为延迟检查,以便它只在事务结束时进行检查;否则,如果我们在将b值插入A之前将其插入B,将违反约束;如果我们在将其插入B之前将其插入A,将出现外键违规。.
6.12?? ?考虑以下泛化和特化的格栅结构(未显示属性)。).
对于实体集A、B和C,请解释属性如何从更高级的实体集X和Y继承。讨论当X的某个属性与Y的某个属性同名时如何处理。.
Answer:
A继承X的所有属性,还可以定义自己的属性。类似地,C继承Y的所有属性以及自己的属性。B继承X和Y的所有属性。如果存在属于X和Y的某个属性名称,可以通过限定名称X.name或Y.name在B中引用它。.
6.13 一个 E-R 图通常模型化企业在某一时刻的状态。假设我们希望追踪时间变化,即数据随时间的变化。例如,张可能在2015年9月至2019年5月期间是一名学生,而尚卡可能从2018年5月到2018年12月曾以爱因斯坦为导师,然后再次从2019年6月到2020年1月。同样,实体或关系的属性值,如课程的标题和学分、工资,甚至是导师的姓名和学生的总学分,都可能随时间而变化。一种建模时间变化的方式如下:我们定义一个名为“valid time”的新数据类型,它是一个时间间隔或一组时间间隔。然后,我们为每个实体和关系关联一个“valid time”属性,记录实体或关系有效的时间段。时间间隔的结束时间可以是无穷大;例如,如果尚卡于2018年9月成为学生,并且仍然是学生,我们可以将有效时间间隔的结束时间表示为尚卡实体的无穷大。类似地,我们将随时间变化的属性建模为一组值,每个值都有自己的有效时间。
a. 制作具有学生和教师实体以及指导关系的 E-R 图,并考虑到对时间变化的扩展。
c.?? ?将上述讨论的 E-R 图转换为一组关系。
很明显,生成的关系集合相当复杂,导致在编写SQL查询等任务上存在困难。一种更广泛采用的替代方法是在设计 E-R 模型时忽略时间变化(特别是属性值的时间变化),并修改从 E-R 模型生成的关系以追踪时间变化。
Answer:
a. E-R 图显示在图6.106中。假设主键属性 student id 和 instructor id 是不可变的,即它们在时间上不允许更改。所有其他属性被认为可能随时间而改变。请注意,图中使用了多值组合属性,如 valid times 或 name,以及诸如 start time 或 value 之类的子属性。value 属性是一些属性的子属性,例如 name、total credits 和 salary,它指的是在特定时间间隔内的姓名、总学分或工资。
b. 生成的关系如下所示。每个多值属性都转化为一个关系,其关系名称由原始关系名称与多值属性的名称连接而成。与实体对应的关系仅包含主键属性,这是为了确保唯一性。
sql
Copy code
student(student_id)
student_valid_times(student_id, start_time, end_time)?
student_name(student_id, value, start_time, end_time)?
student_dept_name(student_id, value, start_time, end_time)?
student_tot_credits(student_id, value, start_time, end_time)?
instructor(instructor_id)?
instructor_valid_times(instructor_id, start_time, end_time)?
instructor_name(instructor_id, value, start_time, end_time)?
instructor_dept_name(instructor_id, value, start_time, end_time)?
instructor_salary(instructor_id, value, start_time, end_time)?
advisor(student_id, instructor_id, start_time, end_time)
上述主键直接源自 E-R 图。如果我们添加额外的约束,即时间间隔不能重叠(甚至更弱的条件,即一个开始时间不能有两个结束时间),我们可以从所有上述主键中移除结束时间。
??
?