7.5 实体-联系图
7.5.1 基本结构
7.5.2 映射基数
箭头线段形式
小结
l..h表示形式
7.5.3 复杂的属性
7.5.4 角色
7.5.5 非二元的联系集
7.5.6 弱实体集
弱实体集
标识性联系
E-R图中弱实体集和强实体集的区别
7.5.7 大学的E-R图
7.5 实体-联系图
1.3.3节曾经简要地介绍过,E-R
图(E-R diagram
)可以图形化表示数据库的全局逻辑结构。E-R
图既简单又清晰,这些是致使E-R
模型广泛使用的重要性质。
7.5.1 基本结构
E-R
图包括如下几个主要构件:
- 分成两部分的**
矩形
代表实体集
**。本书中有阴影的第一部分包含实体集的名字,第二部分包含实体集中所有属性的名字。 - 菱形代表联系集。
- 未分割的矩形代表联系集的属性。构成主码的属性以
下划线
标明。 线段
将实体集连接到联系集。虚线
将联系集属性连接到联系集。双线
显示实体在联系集中的参与度。双菱形
代表连接到弱实体集的标志性联系集(我们将在7.5.6节讲述标志性联系集和弱实体
考虑图7-7中的ER
图,它由通过二元联系集advisor
关联的两个实体集instructor
和student
组成。同instructor
相关联的属性为ID
、name
和salary
。同student
相关联的属性为ID
、name
和tot_cred.
。如图7-7所示,实体集的属性中那些组成主码的属性以下划线标明。
如果一个联系集有关联的属性,那么我们将这些属性放入一个矩形中,并且用虚线将该矩形与代表联系集的菱形连接起来。例如,在图7-8中,我们有描述性属性dame
附带到联系集 advisor
上,表示教师成为导师的日期。
7.5.2 映射基数
箭头线段形式
实体集instructor
和student
之间的联系集advisor
可以是一对一、一对多、多对一或多对多的。为了区别这些类型,我们在所讨论的联系集和实体集之间画一个箭头(→)或一条线段(一),如下所示。
一对一:我们从联系集 advisor
向实体集 instructor
和 student
各画一个箭头(见图7-9a)。这表示一名教师可以指导最多一名学生,并且一名学生可以有最多一位导师。
一对多:我们从联系集 advisor
画一个箭头到实体集instructor
,以及一条线段
到实体集 student
(见图7-9b)这表示一名教师可以指导多名学生,但一名学生可以有至多一位导师。
多对一:我们从联系集advisor
画一条线段
到实体集instructor
,以及一个箭头
到实体集student
。这表示一名教师可以指导至多一名学生,但一名学生可以有多位导师。
多对多:我们从联系集advisor
向实体集instructor
和student
各画一条线段
(见图7-9c)。这表示一名教师可以指导多名学生,并且一名学生可以有多位导师。
小结
箭头
表示一
线段
表示多
l..h表示形式
ER
图还提供了一种描述每个实体参与联系集中的联系的次数的更复杂的约束的方法。实体集和二元联系集之间的一条边可以有一个关联的最大和最小的映射基数,用l..h
的形式表示,其中
l
表示最小
的映射基数,- 而
h
表示最大
的映射基数。 - 最小值
l
为1表示这个实体集在该联系集中全部参与,即实体集中的每个实体在联系集中的至少一个联系中出现。 - 最大值
h
为1表示这个实体参与至多一个联系,而最大值为*
代表没有限制。
例如,考虑图7-10:
在advisor
和student
之间的边有1..1
的基数约束,意味着基数的最小值和最大值都是1,也就是,每个学生必须有且仅有一个导师。
从advisor
到instructor
边上的约束0..*
说明教师可以有零个或多个学生
。因此, advisor
联系是从instructor
到student
的一对多联系,更进一步地讲, student
在advisor
联系中的参与是全部的,表示一个学生必须有一个导师
。
很容易将左侧边上的0..*
曲解为联系advisor
是从instructor
到student
多对一的,而这正好和正确的解释相反。
图7-10中的E-R
图的另一种画法是在基数约束的位置画一条从student
到advisor
的双线,以及一个从advisor
到instructor
的箭头。这种画法可以强制实施同图7-10中所示约束完全一样的约束。
7.5.3 复杂的属性
图7-11说明了怎样在E-R
图中表示复合属性。这里一个具有子属性first_name
、 middle_initial
和last_name
的复合属性name
代替了instructor
的简单属性name
。再例如,假定我们给实体集instructor
增加个地址。地址可以定义为具有属性street
、city
、sate
和a_code
的复合属性address
属性street
本身也是一个复合属性,其子属性为street_number
、 street_name
和apartment_number
。
在图7-11还给出了一个由”{phone_number}
“表示的多值属性phone_number
和一个由”{age()}
“表示的派生属性age
。
7.5.4 角色
在E-R
图中,我们通过在菱形和矩形之间的连线上进行标注来表示角色。图7-12给出了course
实体集和prereq
联系集之间的角色标识course id
和prereq_id
。
7.5.5 非二元的联系集
非二元的联系集也可以在E-R
图中简单地表示。图7-13包含三个实体集instructor
、 student
和project
,它们通过联系集proi_ guide
相关联。
在非二元的联系集中,我们可以表示某些类型的多对一联系。假设一个student
在每个项目上最多只能有一位导师。这种约束可用从proj_guide
的边指向instructor
的箭头来表示。
省略部分内容….
7.5.6 弱实体集
考虑一个section
实体,它由课程编号、学期、学年以及开课编号唯一标识。显然,开课实体和课程实体相关联。假定我们在实体集section
和course
之间创建了一个联系集sec_course
。
现在,发现sec_course
中的信息是冗余的,由于section
已有属性course_id
,它标识该开课所关联的课程。消除这种冗余的一个方法是删除联系sec_course
;然而,这么做使得section
和course
之间的联系隐含于一个属性中,这并不是我们想要的。
消除这种冗余的另一个方法是**在实体section
中不保存属性course_id
,而只保存剩下的属性sec_id
,year
以及semester
**。然而,这样的话实体集section
就没有足够的属性唯一标识一个指定的section
实体;即使每个section
实体都是唯一的,不同课程的开课也可能会有相同的sec_id
、year
以及semester.
。为解决这个问题,我们将联系sec_course
视为一个特殊的联系,它给唯一标识section
实体提供额外信息,即course_id
.
弱实体集
- 没有足够的属性以形成
主码
的实体集
称作弱实体集(weak entity set
)。 - 有主码的实体集称作强实体集(
strong entity set
)。
弱实体集必须与另一个称作标识( identifying
)或属主实体集(owner entity set
)的实体集关联才能有意义。
每个弱实体必须和一个标识实体关联;也就是说,弱实体集存在依赖(existence dependent
)于标识实体集。
我们称标识实体集
拥有(own
)它所标识的弱实体集
。
标识性联系
将弱实体集
与其标识实体集
相联的联系
称为标识性联系( identifying relationship
)
标识性联系是从弱实体集
到标识实体集
多对一的,并且弱实体集在联系中的参与是全部的。标识性联系集不应该有任何描述性属性,因为这种属性中的任意一个都可以与弱实体集相关联。
在我们的例子中, section
的标识实体集
是course
,将section
实体和它们对应的course
实体关联在起的sec_course
是标识性联系
。
虽然弱实体集没有主码,但是我们仍需要区分依赖于特定强实体集的弱实体集中的实体的方法。弱实体集的分辨符
(discriminator
)是使得我们进行这种区分的属性集合。例如,弱实体集section
的分辨符由属性sec_id
、year
以及semester
组成,因为对每门课程来说,这个属性集唯一标识了这门课程的移一次开课。弱实体集的分辨符
也称为该实体集的部分码
弱实体集
的主码由标识实体集的主码
加上该弱实体集的分辨符
构成。在实体集section
的例子中,它的主码是{course_id,sec_id, year, semester}
,其中course_id
是标识实体集course
的主码,sec_id,year, semester
区分同一门课程的不同section
实体。
注意,我们可以选择使sec_id
对于大学所提供的所有课程都不重复,在这种情况下实体集section
将会具有一个主码。然而,一个section
的存在在概念上仍依赖于一个course
,通过使之成为弱实体集可以明确这种依赖关系。
E-R图中弱实体集和强实体集的区别
在ER
图中,弱实体集和强实体集类似,以矩形表示,但是有两点主要的区别:
- 弱实体集的
分辨符
以虚下划线
标明,而不是实线。 - 关联
弱实体集
和标识性强实体集
的联系集以双菱形
表示。
在图7-14中,弱实体集section
通过联系集sec_course
依赖于强实体集course
。
该图还表明了如何使用双线表明全部参与;(弱)实体集section
在联系sec_course
中的参与是全部的,表示每次开课都必须通过sec_course
同某门课程关联。最后,从sec_course
指向course
的箭头
表示每次开课与单门课程相关联。
弱实体集可以参与标识性联系以外的其他联系。例如, section
实体可以和time_slot
实体集参与个联系,以标识开课的时间。
弱实体集可以作为属主与另一个弱实体集参与一个标识性联系。
一个弱实体集也可能与不止一个标识实体集关联。这样,一个特定的弱实体将被一个实体的组合标识,其中每个标识实体集有一个实体在该组合中。
弱实体集的主码可以由标识实体集的主码的并集加上弱实体集的分辨符组成。
在某些情况下,数据库设计者会选择将一个弱实体集表示为属主实体集的一个多值复合属性。
在我们的例子中,这种方法需要实体集course
具有一个多值复合属性section
。如果弱实体集只参与标识性联系,而且其属性不多,那么在建模时将其表示为一个属性更恰当。相反地,如果弱实体集参与到标识性联系以外的联系中,或者其属性较多,则建模时将其表示为弱实体集更恰当。很明显, section
不符合建模成多值复合属性的要求,而将其建模为弱实体集更恰当。
7.5.7 大学的E-R图
图7-15展示了本书迄今所使用的大学所对应的E-R图。除了增加了若干约束,以及section
为弱实体以外,该ER
图与我们在74节中看到的大学E-R
模型的文字性描述等价。
在我们的大学数据库中,我们限制每名教师必须有且仅有一个相关联的系。因此,如图7-15所示,在instructor
和inst_dept
之间有一条双线,表示instructor
在inst_dept
中全部参与;即每名教师必须和一个系相关联。另外,存在一个从inst_dept
到department
的箭头,表示每个教师可以有至多一个相关联的系。