目录
三个核心概念:
实体集
联系集
属性
约束:
映射基数
参与约束
码
删除冗余属性
E-R图的画法
基本结构
映射基数的表示
复杂属性的表示
角色
弱实体集
E-R图转换为关系模式
扩展的E-R特性
特化
概化
属性继承
概化上的约束
聚集
新特性转换为关系模式
效率度量方法
E-R模型就是实体-联系(entity-relationship)模型,旨在方便数据库的设计
实体是现实世界中可区别与所有其他对象的一个事物或者“对象”,比如大学里的每一个人都是一个实体。实体具有描述性属性,比如student实体具有学号id等。
实体集是相同类型即具有相同性质或属性的一个实体集合,比如大学里的所有学生的集合可以定义为实体集student。下图就是两个实体集。
实体集可以相交,比如一个person实体也可以同时是student实体,也可以是instructor实体。
联系是指多个实体之间的相互关联。比如我们可以定义instructor实体Kim和student实体Zhang之间的联系advisor。这一联系指明Kim是Zhang的老师。
联系集是相同类型的联系的集合。
实体集之间的关联称为参与。可以说实体集student和实体集instructor参与联系集advisor。
E-R模式中的一个联系实例表示命名实体间的一个关联。可以说instructor实体Kim和student实体Zhang参与到联系集advisor的一个联系实例中。
联系也可以像实体一样,具有描述性属性。比如实体集instructor和实体机student之间的联系集advisor,我们可以定义一个属性date与联系集advisor关联起来,表示教师称为学生的导师的日期。如下图所示。
一个实体集也可以参与到多于一个联系集中。设计两个实体集的联系集叫做二元联系集,比如上述的联系集advisor。大部分联系集都是二元的,当然也有三元的。
参与联系集的实体集的数目我们称之为联系集的度。二元联系的度就是2。
每个属性都有一个可以取值的集合,称为该属性的域(domain),或者值集。
E-R模型中的属性可以按照如下的属性类型划分:
E-R模型中可以定义一些数据库中数据必须满足的约束。约束分为映射基数,参与约束,还有其他我们这里不讨论。
映射基数,又叫基数比率,表示一个实体通过一个联系集能关联的实体个数。
对于实体集A和实体集B之间的二元联系集R来说,映射基数必是下面四种情况之一:
如果实体集E中的每个实体都参与到联系集R的至少一个联系中,则实体集E在联系集R中的参与称为全部的。如果E只有部分实体参与到R的联系中,则E在R的参与称为部分的。在上图7-5中,图a中B在联系集中的参与是全部的,而A在联系集中的参与是部分的。图b中A,B在联系集中的参与都是全部的。
码用于区分一个实体集中的实体。一个实体集的属性值必须可以唯一标识该实体,也就是说在一个实体集中不允许存在对于所有属性都完全相同的两个实体。我们可以定义主码来唯一标识一个实体。
实体集instructor包含属性id,name,dept_name以及salary,其中id是主码。实体集department包含属性dept_name,building以及budget,其中dept_name是主码。
属性dept_name在两个实体集中都出现了,是冗余的。由于它是department的主码,不能删,所以我们需要删除instructor中的dept_name属性。
但是删除之后我们该如何将实体集instructor和department关联起来呢?我们需要将两个实体集之间的关联统一看成联系,而不是某个实体集的属性。
一个好的E-R设计应该不包含冗余的属性,比如下面的设计,下划线表示主码。比如inst_dept,stud_dept就用于关联两个实体集。
箭头表示一,线段表示多。
比如:
student与instructor一对一,则两边都应该是箭头
instructor与student一对多:一个instructor可以教多个student,但是一个student最多有一位导师,则箭头应该指向instructor,线段连接student。
多对一则箭头指向student,线段连接instructor。
多对多:
除此之外,E-R图还提供了一种描述每个实体参与联系集中联系的次数的另个一约束的方法。实体集和二元联系集之间的一条边可以有一个关联的最大和最小的映射基数,用l..h表示。l表示最小映射基数,h表示最大映射基数。l等于1表示这个实体集在该联系集中全部参与;h等于1表示这个实体集的实体最多参与一个联系;h等于 * 表示最大联系数没有限制。
分析上图,0..* 表示instructor实体最少参与0次联系,最多参与所有联系。即一个instructor可以教所有学生,也可以教0个学生。1..1 表示一个学生最少有一个导师,同时最多有一个导师,即每个学生必须有且仅有一个导师。
l..h 这种描述比箭头和线段更加精确。
如何在E-R图中表示复杂属性:比如instructor实体集中有复杂属性name和address,在E-R图中表示如下
注意:多值属性phone_number在E-R图中要用 { } 括起来,表示一个instructor实体可以有多个电话号码。age为派生属性,需要用age( ) 表示。
我们在E-R图中在菱形和矩阵之间的连线上进行标注来表示角色。
考虑一个section实体,由课程编号,学期,学年以及开课编号唯一标识。显然,course实体与section实体相关联。如果我们保留section中的课程编号,就使得section和course之间的联系隐含于实体集的一个属性中,这在E-R图中是不规范的。解决方法就是删除section的课程编号属性,并新建一个联系集sec_course来联系两个实体集。
但是如果在section中删除了课程编号,剩下的属性year,semester,sec_id并不能唯一标识一个指定的section实体。即使每个section实体都能被唯一标识,不同课程的开课也可能会有相同的year,semester和sec_id。
那么section实体集就是一个弱实体集。弱实体集就是没有足够的属性以形成补码的实体集。有主码的实体集叫做强实体集。
为了解决section无主码的问题,我们将sec_course视为一个特殊的联系,它给唯一标识的section实体提供course_id。
弱实体集必须与另一个称为标识实体集或者属主实体集的实体集关联才有意义。弱实体集存在依赖于标识实体集中。我们称实体集拥有它所标识的弱实体集。将弱实体集与其标识实体集相连的联系称为标识性联系。
以section和course举例,course就是标识实体集,sec_course是标识性联系。
弱实体集的分辨符使得我们可以区分弱实体集的实体,section的分辨符由section的三个属性组成。分辨符也叫作弱实体集的部分码。
弱实体集的主码由标识实体集的主码加上弱实体集的分辨符组成。
在E-R图中弱实体集表示如下:
双线表示实体集的实体每个实体都参与联系集的联系。表示每此开课section都必须通过sec_course与某个course相关联。弱实体集的分辨符用虚下划线表示。关联弱实体集和标示性强实体集的联系集以双菱形表示。(友情提示:即便这里在section中去掉了course_id属性,但是将E-R图转换为真正的关系模式时,此关系模式还是具有course_id的,即在真正的数据库表中section表有course_id属性)。
即根据E-R图在数据库中建立起真正的表。
实体集可能包含一些子集,比如实体集person可以进一步归类为employee和student。employee实体可以进一步用属性salary来描述,而student可以用属性tot_cred描述。在实体集内部进行分组的过程叫做特化。
E-R图中特化用空心箭头表示。由特化实体集(即employee和student实体集)指向另一方实体。这种关系叫做“ISA”关系,表示“is a”。
一个实体集能够同时属于多个特化实体集(比如一个人可以即是student又是employee),则这种特化称为重叠特化。一个实体集最多属于一个特化实体集,则这种特化称为不相交特化。对于重叠特化,分开使用两个箭头,比如上图employee和student。对于不相交特化,使用一个箭头,比如上图instructor和secretary。
注意上图中person有的属性,在特化出来的实体集中就不用再写一遍了。
特化是自顶向下的,概化是自底向上的。多个实体集根据共同具有的特征综合成一个较高层的实体集,就是概化。高层和底层实体集也可以分别称为超类和子类。
概化和特化中,高层实体集的属性被底层实体集所继承。一个底层实体集只参与到一个ISA联系中,则称这个实体集具有**单继承,**参与多个ISA联系,则是多继承。
概化的表示。有两种方法:
1是为高层实体集创建一个模式,为每个低层实体集创建一个模式。在低层实体集上建立外码约束。注意不必在employee和student中添加person的其他属性如name,而是通过ID来关联name的值。
2是如果概化是不相交且完全的,即不存在同时属于两个同级的低层实体集的实体,且高层实体集的任何实体也都是某个低层实体集的成员,那么可以采用这种表示方法:不为高层实体集创建任何模式,只需要为每个低层实体集创建一个模式。如下:
聚集的表示: