实体关系建模是一种自顶而下的数据库设计方法,通过定义一些实体(entity)和实体之间的关系(relationship),对实体和关系更细节描绘的属性(attribute)和限制(constraint)来进行建模。其中一种非常重要的方法叫做UML。一些概念如下所述:
Structural Constraints(结构约束):参与一个联系的实体之间可能存在的约束。约束包括以下几种:
使用长方形来表示实体,实体中每一个单词的首字母通常大写。
使用一条连接两个实体的线表示联系并标注联系的名字,一个关系只能标注一个方向。
使用菱形来表示度大于2的联系类型。
在递归型联系或者两个实体间存在多个联系的情况下,我们需要标注实体所扮演的角色。
对于属性,我们将长方形分为两部分,上面为实体名字,下面为属性。第一个属性应该是Primary key,添加tag {PK},属性的第一个单词首字母要小写,其余单词的首字母大写。另外,我们也可以添加{PPK}来代表Composite key,以及{AK}来代表 alternate key。
在一些复杂数据库系统中,我们可能不需要添加全部的属性,但是要添加Primary key,此时可不添加tag。
对于多值属性,我们会标记取值范围。对于派生属性,我们添加前缀/。一个例子如下所示。
对于关系的属性,我们仍然使用一个长方形来代表属性,为了和实体进行区别,我们使用虚线来绘制。
多样性约束:在表示实体的长方形旁边我们通过两个点来表示具体的约束类型,例子如下:
Fan trap(扇形圈套): 模型表示实体类型之间的关系,但某些实体出现之间的路径不明确。
当一个实体存在至少两个一对多关系,此时会出现扇形圈套,例子如下:
从上图我们可以知道一个division有至少一个staff,一个division至少操作一个branch。接下来我们通过一些数据绘制semantic net。
此时如果我们想知道员工SG37在哪个branch,我们只能知道在B003或者B007,这就是扇形圈套。
为了解决这个问题,我们重建实体关系模型来表示实体之间正确的联系,如下所示。
Chasm trap(深坑圈套): 模型表明实体类型之间存在关系,但某些实体事件之间不存在路径。
当存在至少一个最小多样性约束为0的关系形成相关实体之间的路径的一部分时,可能会出现深坑圈套。例子如下图:
通过这个ER图,当我们想知道Branch和PropertyForRent之间的联系时,由于Staff和PropertyForRent相互之间的最小约束均为0,我们无法判断Branch和PropertyForRent之间的联系。解决方法是在Branch和PropertyForRent之间添加一个联系,如下图
附加额外的语义概念的实体关系模型被叫做增强实体关系模型(EER)。本节我们描述了 EER 模型中三个最重要和最有用的附加概念。
我们可以将实体类型形成为包含超类和子类的层次结构。
有独特子类的实体类型叫做超类。举例说明:实体员工被认为是子类经理、秘书、销售员的超类。超类和其中一个子类的关系叫做超类/子类联系。引入子类/超类重要的原因是对于不同子类,他们的属性可能并不相同,例如经理具有独特的属性分红,而销售具有独特的属性销售领域,如果我们仅仅将员工作为一个实体,我们会有很多空白的属性。
Specialization(特化): 通过识别实体成员的显着特征来最大化实体成员之间差异的过程。
特化是一种自顶而下的方法来定义超集的集合和对应的子集。子类的集合是根据超类中实体的一些显着特征来定义的,当我们定义子集后,我们将特定的属性关联到每个子集,之后再定义子集和其他实体或子集之间的联系。例如我们有一个实体员工,我们就尝试寻找员工实体中成员的区别,比如员工里有经理、会计、销售员等,我们将这些作为员工的子集即可。
Generalization(泛化):通过识别实体的共同特征来最小化实体之间差异的过程。
泛化是一种自底而上的方法,从原有的实体类型得到一个泛化的超集。例如我们有经理、会计、销售三个实体,我们可以泛化出员工实体作为超集。泛化可以被视为特化的反向过程。
我们通过直线+三角形来连接子类和超类,子类独有的属性在子类的长方形中表示,(Optional, And)表示约束。子类可以和其他的实体进行联系,如下图子类Manager和实体Branch存在联系。
我们可以通过不同的特征来表示不同的特化。如下图员工实体包含两组特化,一组是经理、销售和秘书,另一组是全职员工和兼职员工。
下图展现了Type hierarchy(类型层次结构),我们可以看到助理秘书是秘书的子类,他除了拥有自己独特的属性,也拥有秘书和员工的属性;销售经理是销售和经理的共享子类,他包含销售和经理和员工的所有属性。
Participation constraint(参与约束): 确定超类中的每个成员是否必须作为子类的成员参与。约束分为两种,mandatory(强制)和optional(可选)
Disjoint constraint(无衔接约束): 描述子类成员之间的关系,并指示超类的成员是否可能成为一个或多个子类的成员。当超类有多个子类时需要判断是否衔接
Aggregation(聚合):表示实体类型之间的“has-a”或“is-part-of”关系,其中一个表示“整体”,另一个表示“部分”。
当我们想表示其中一个实体是大的实体(whole),包含另一个小的实体(parts)。例如“has”联系。聚合不会改变整体与部分之间关系的导航意义,也不会链接整体及其部分的生命周期。
在ER图上,我们在大的实体的一端添加一个透明的菱形代表聚合。
Composition(组成):一种特定形式的聚合,表示实体之间的关联,其中“整体”和“部分”之间存在强大的所有权和巧合的生命周期。
例如实体报纸和实体广告之间存在的展示联系,而报纸和广告之间存在和强烈的生命周期联系,所以他们属于组成。