数据库E-R图

目录

三个核心概念:

实体集

联系集

属性

约束:

映射基数

参与约束

删除冗余属性

E-R图的画法

基本结构

映射基数的表示

复杂属性的表示

角色

弱实体集

E-R图转换为关系模式

扩展的E-R特性

特化

概化

属性继承

概化上的约束

聚集

新特性转换为关系模式

效率度量方法


E-R模型就是实体-联系(entity-relationship)模型,旨在方便数据库的设计

三个核心概念:

实体集

实体是现实世界中可区别与所有其他对象的一个事物或者“对象”,比如大学里的每一个人都是一个实体。实体具有描述性属性,比如student实体具有学号id等。

实体集是相同类型即具有相同性质或属性的一个实体集合,比如大学里的所有学生的集合可以定义为实体集student。下图就是两个实体集。

数据库E-R图_第1张图片

 

实体集可以相交,比如一个person实体也可以同时是student实体,也可以是instructor实体。

联系集

联系是指多个实体之间的相互关联。比如我们可以定义instructor实体Kim和student实体Zhang之间的联系advisor。这一联系指明Kim是Zhang的老师。

联系集是相同类型的联系的集合。

数据库E-R图_第2张图片

 

实体集之间的关联称为参与。可以说实体集student和实体集instructor参与联系集advisor。

E-R模式中的一个联系实例表示命名实体间的一个关联。可以说instructor实体Kim和student实体Zhang参与到联系集advisor的一个联系实例中。

联系也可以像实体一样,具有描述性属性。比如实体集instructor和实体机student之间的联系集advisor,我们可以定义一个属性date与联系集advisor关联起来,表示教师称为学生的导师的日期。如下图所示。

数据库E-R图_第3张图片

 

一个实体集也可以参与到多于一个联系集中。设计两个实体集的联系集叫做二元联系集,比如上述的联系集advisor。大部分联系集都是二元的,当然也有三元的。

参与联系集的实体集的数目我们称之为联系集的度。二元联系的度就是2。

属性

每个属性都有一个可以取值的集合,称为该属性的(domain),或者值集。

E-R模型中的属性可以按照如下的属性类型划分:

  • 简单和复合属性。能够划分为更小部分的属性叫做复合属性,反之为简单属性。比如student的学号id就是简单属性;student的姓名name是复合属性,name可以划分为first_name,last_name。复合属性可以是有层次的,即复合属性address划分为street,city,state等,而street还可以继续往下划分。
  • 单值和多值属性。一个student对应一个学号id,那么id就是一个单值属性。一个学生可以有多个电话号码phone_number属性,那么phone_number属性就是一个多值属性。为了表示一个属性是多值的,我们用花括号将属性名括住,比如{ phone_number }。
  • 派生属性。这类属性的值可以从别的相关属性和实体中派生出来。比如student实体有一个属性age,还有一个属性birthday_date,那么我们可以利用当前的日期和出生日期算出age的值,因此age就是派生属性。在这里,birthday_date称为基属性,或存储的属性。派生属性的值不存储,而是在需要用的时候计算出来。

约束:

E-R模型中可以定义一些数据库中数据必须满足的约束。约束分为映射基数,参与约束,还有其他我们这里不讨论。

映射基数

映射基数,又叫基数比率,表示一个实体通过一个联系集能关联的实体个数。

对于实体集A和实体集B之间的二元联系集R来说,映射基数必是下面四种情况之一:

  • 一对一。A的一个实体最多与B的一个实体相关联,B的一个实体也最多与A的一个实体相关联。注意AB之中可以存在一个也不关联的实体。
  • 一对多。A的一个实体可以关联B中多个实体,而B的一个实体最多与A的一个实体相关联。比如一个班主任实体可以关联多个学生实体。
  • 多对一。B的一个实体可以关联A中多个实体,而A的一个实体最多与B的一个实体相关联。
  • 多对多。B的一个实体可以关联A中多个实体,反过来也一样。比如一个学生可以关联多个老师,一个老师可以关联多个学生。

数据库E-R图_第4张图片

 

参与约束

如果实体集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就用于关联两个实体集。

数据库E-R图_第5张图片

 

E-R图的画法:

基本结构

  • 分割的矩阵:代表实体集。矩阵分割为两部分,上面是实体集名字,下面是实体集属性。
  • 菱形:联系集
  • 未分割的矩阵:代表联系集的属性。
  • 线段:连接实体集与联系集。
  • 虚线:连接联系集与联系集属性。
  • 双线:显示实体在联系集中的参与度。
  • 双菱形:连接到弱实体集的标志性联系集。

数据库E-R图_第6张图片

 

映射基数的表示

箭头表示一,线段表示多。

比如:

student与instructor一对一,则两边都应该是箭头

数据库E-R图_第7张图片

 

instructor与student一对多:一个instructor可以教多个student,但是一个student最多有一位导师,则箭头应该指向instructor,线段连接student。

数据库E-R图_第8张图片

 

多对一则箭头指向student,线段连接instructor。

多对多:

数据库E-R图_第9张图片

 

除此之外,E-R图还提供了一种描述每个实体参与联系集中联系的次数的另个一约束的方法。实体集和二元联系集之间的一条边可以有一个关联的最大和最小的映射基数,用l..h表示。l表示最小映射基数,h表示最大映射基数。l等于1表示这个实体集在该联系集中全部参与;h等于1表示这个实体集的实体最多参与一个联系;h等于 * 表示最大联系数没有限制。

数据库E-R图_第10张图片

 

分析上图,0..* 表示instructor实体最少参与0次联系,最多参与所有联系。即一个instructor可以教所有学生,也可以教0个学生。1..1 表示一个学生最少有一个导师,同时最多有一个导师,即每个学生必须有且仅有一个导师。

l..h 这种描述比箭头和线段更加精确。

复杂属性的表示

如何在E-R图中表示复杂属性:比如instructor实体集中有复杂属性name和address,在E-R图中表示如下

数据库E-R图_第11张图片

 

注意:多值属性phone_number在E-R图中要用 { } 括起来,表示一个instructor实体可以有多个电话号码。age为派生属性,需要用age( ) 表示。

角色

我们在E-R图中在菱形和矩阵之间的连线上进行标注来表示角色。

数据库E-R图_第12张图片

 

弱实体集

考虑一个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图中弱实体集表示如下:

数据库E-R图_第13张图片

 

双线表示实体集的实体每个实体都参与联系集的联系。表示每此开课section都必须通过sec_course与某个course相关联。弱实体集的分辨符用虚下划线表示。关联弱实体集和标示性强实体集的联系集以双菱形表示。(友情提示:即便这里在section中去掉了course_id属性,但是将E-R图转换为真正的关系模式时,此关系模式还是具有course_id的,即在真正的数据库表中section表有course_id属性)。

E-R图转换为关系模式

即根据E-R图在数据库中建立起真正的表。

  1. 具有简单属性的强实体集的表示。主码不变,属性也不变,直接建表就行。
  2. 具有复杂属性的强实体集的表示。复合属性有很多子属性,我们通过为每个子属性创建一个单独的属性,而并不为复合属性自身单独创建一个属性,比如student在关系模式中无name属性,而具有first_name,last_name属性。如果子属性还是复合属性,那么就继续往下分。对于多值属性,我们需要创建新的关系模式(创建新的表)来表示复合属性。对于派生属性,并不在关系模式中显示地表示出来。
  3. 弱实体集的表示。弱实体集的属性包含标识性实体集的主码和弱实体集的所有属性。而连接弱实体集与标识性实体集的联系集我们不再新建一个表来表示。
  4. 联系集的表示。注意主码的选择,如果是一对多,则多的那个实体集的主码就是联系集的主码。一对一,则都行。多对多,则两个实体集的主码的并集作为联系集的主码。同样,我们也可以像弱实体集那样处理,不新建表来表示联系集,而是将联系集作为属性赋给某个实体集。如果实体集中部分实体参与联系集,也可以用null表示。
  5. 联系集的属性的布局。一对一或者一对多的联系集的属性可以放到一个参与到该联系的实体集中。比如一个instructor教导多个学生,则instructor何时成为一个学生的导师的date,可以当做student实体的属性。

扩展的E-R特性

特化

实体集可能包含一些子集,比如实体集person可以进一步归类为employee和student。employee实体可以进一步用属性salary来描述,而student可以用属性tot_cred描述。在实体集内部进行分组的过程叫做特化。

E-R图中特化用空心箭头表示。由特化实体集(即employee和student实体集)指向另一方实体。这种关系叫做“ISA”关系,表示“is a”。

数据库E-R图_第14张图片

 

一个实体集能够同时属于多个特化实体集(比如一个人可以即是student又是employee),则这种特化称为重叠特化。一个实体集最多属于一个特化实体集,则这种特化称为不相交特化。对于重叠特化,分开使用两个箭头,比如上图employee和student。对于不相交特化,使用一个箭头,比如上图instructor和secretary。

注意上图中person有的属性,在特化出来的实体集中就不用再写一遍了。

概化

特化是自顶向下的,概化是自底向上的。多个实体集根据共同具有的特征综合成一个较高层的实体集,就是概化。高层和底层实体集也可以分别称为超类和子类。

属性继承

概化和特化中,高层实体集的属性被底层实体集所继承。一个底层实体集只参与到一个ISA联系中,则称这个实体集具有**单继承,**参与多个ISA联系,则是多继承。

概化上的约束

  1. 条件定义的。在条件定义的低层实体集中,成员资格的确认基于实体是否满足一个显示的条件或谓词。比如person有个属性person_type,person_type等于employee时才能确认此实体属于低层实体employee。
  2. 用户定义的。用户定义的低层实体集不是通过成员资格条件来限制,而是用户将实体指派给某个实体集。
  3. 不相交。不相交约束要求一个实体最多属于一个低层实体集。
  4. 重叠。与不相交相反,一个人可以即是雇员又是学生。
  5. 全部概化或特化。每个高层实体必须属于一个低层实体集。在E-R图中表示为在图中加入关键词total,并画一条从关键词total到相应的空心箭头的虚线。
  6. 部分概化或特化。允许一些高层实体不属于任何低层实体集。默认就是部分概化,所以在E-R图中没有什么表示。

聚集

 数据库E-R图_第15张图片

数据库E-R图_第16张图片

 

 

 

新特性转换为关系模式

概化的表示。有两种方法:

1是为高层实体集创建一个模式,为每个低层实体集创建一个模式。在低层实体集上建立外码约束。注意不必在employee和student中添加person的其他属性如name,而是通过ID来关联name的值。

数据库E-R图_第17张图片

2是如果概化是不相交且完全的,即不存在同时属于两个同级的低层实体集的实体,且高层实体集的任何实体也都是某个低层实体集的成员,那么可以采用这种表示方法:不为高层实体集创建任何模式,只需要为每个低层实体集创建一个模式。如下:

聚集的表示:

数据库E-R图_第18张图片

效率度量方法

  1. 吞吐量,即每单位时间内能够处理的查询或者更新的(通常指事务)平均数量。
  2. 相应时间,即单个事务从开始到结束所需的平均时间或者最长时间。

你可能感兴趣的:(数据库,mysql,sql)