书籍:《数据库管理系统:原理与设计》
实体集:相似的实体
实体通过属性来描述。
对于每个与实体集相关的属性,必须确定该属性的值域。
对于每个实体集,我们都选择一个key,key就是一组最小的属性集合。它们的值能唯一确定实体中的每个实体。有可能存在多个候选key,这时我们在其中指定一个作为主key。
联系就是两个或多个实体之间的一种关联。
把相似的联系放在一起,组成一个联系集。
联系集也可以具有描述性属性。
!联系必须能够用参与它的实体唯一确定,而不必引用该联系的描述属性。例如,在works_in联系集中,每个联系都能用雇员的ssn和部门的did来唯一标识。对于一个给定的ssn和did,不可能有多余一个的相应since值(联系中的一个属性)
有时一个联系可能包含两个同一实体集中的两个实体。如果一个实体集在一个联系集中扮演多种角色,角色指示器与联系集中的属性连在一起给出了一个唯一的名字。
键约束:用箭头表示,也就是说一个实体集最多在联系集中出现一次。对于一个给定的实体,可以唯一确定出现在联系集中的联系。
Departments实体最多出现在一个manages联系中。
这样的联系有时也称为一对多。如果employee实体也有一个箭头指向manager的话,那么这个联系集就变成了一对一。
参与约束:分为部分的和完全的。如果一个联系集中的实体集是全部参与的话,那么在两者之间就用粗线连接。
弱实体:一个弱实体可以通过它的一些属性与其他实体的主码结合起来形成唯一标识,称为识别属主。
必须满足下面的限制:
- 识别属主集合弱实体集必须参与一个一对多的联系集(一个识别属主可以与一个或多个弱实体相关联,但每个弱实体只有一个识别属主),这个联系集称为是这个弱实体的识别联系集。
- 弱实体集在联系集中必须是全部参与(粗线)的。
对于给定的识别属主,一个弱实体中,用来标识该实体集的属性集成为这个弱实体的部分键。用下划虚线表示。一个弱实体通过识别属主的主键和自身的部分键来唯一标识。
!弱实体集和它对应的联系集的方框要加粗线。
类层次:类似继承,但是又不完全一样。
这些实体集实例的查询有一个约束条件,对所有Employees实体的查询,必须也要考虑所有的Hourly_Emps和Contract_Emps实体。
可以从两个方面来考虑类层次:
- 将实体集进行细化成子类。细化就是一个标识某个实体集(超类)的子集的过程。
- 将两个实体集(子类)进一步泛化为一个实体集(父类)
根据ISA的结构可以指定两种约束,即交迭约束(overlap)和覆盖约束(covering)。
交迭约束决定是否允许两个子类含有相同的实体,如果没有特别说明,则默认的规则是实体集之间不存在交迭。
覆盖约束决定了子类中的实体是否包括超类中的所有实体。默认没有覆盖约束。
聚合:聚合允许一个联系集(由一个虚线框表示)参与另一个联系集。
如果一个联系集中的属性,对于某一个实体来说,这个值都是相同的,那么会导致信息冗余,比如说一个部门经理和部门形成一个联系集,这个联系集有一个属性表示这个经理管理的所有部门的预算总和。这个时候可以考虑采用继承isa的关系,将经理作为雇员的一个子类,并且将预算总和作为经理实体集的一个属性。
我们可能将属性与联系相关联,而不是与适当的实体相关联,通常这样的错误会导致数据冗余。
选用聚合还是选用一个三元联系,主要看是否存在一个使联系集合实体集(或另一个实体集)相关联的联系,也可以用要表达的完整性约束来指导选择过程。