7.2.2 联系集
联系(relationship
)是指多个实体间的相互关联。
例如,我们可以定义关联教师Katz
和学生Shankar
的联系advisor
。这一联系指明Katz
是学生Shankar
的导师。
再看另一个例子,考虑实体集student
和section
。我们可以定义联系集takes
来表示学生和该学生所注册的开课之间的关联。
参与
实体集之间的关联称为参与;也就是说,实体集E1,E2,…,En
参与(participate
)联系集R。E-R
模式中的一个联系实例( relationship instance
)表示在所建模的现实世界企业中命名实体间的一个关联。例如,一个教师ID
为45565的instructor
实体Katz
和一个学生ID
为12345的student
实体Shankar
参与到advisor
(指导)的一个联系实例中。这一联系实例表示在大学中教师Katz
指导
学生Shankar
角色
实体在联系中扮演的功能
称为实体的角色
(role
)。由于参与一个联系集的实体集通常是互异的因此角色是隐含的并且一般并不指定。但是,当联系的含义需要解释时角色是很有用的。当参与联系集的实体集并非互异的时候就是这种情况;也就是说,同样的实体集以不同的角色不止一次的参与一个联系集。
在这类联系集中,即有时称作自环的( recursive
)联系集中,有必要用显式的角色名来指明实体是如何参与联系实例的。
例如,考虑记录大学开设的所有课程的信息的实体集course
。我们用course
实体的有序对来建模联系集prereq
,以描述一门课程(C2
)是另一门课程(C1
)的先修课
。
每对课程中的第一门课程具有课程C1
的角色,
而第二门课程具有先修课C2
的角色。
按照这种方式,所有的prereg
联系通过(C1,C2)
对来表示,这样可以排除了(C2,C1)
对。
联系的描述性属性
联系
也可以具有描述性属性( descriptive attribute
)。考虑实体集instructor
和student
之间的联系集advisor
。我们可以将属性date
与该联系关联起来,以表示教师成为学生的导师的日期。教师Katz
对应的实体和学生Shankar
对应的实体之间的联系advisor
的属性dae
的值为”10 June 2007
“,表示Katz
于2007年6月10日成为Shankar
的导师。
作为联系的描述性属性的一个更实际的例子,考虑实体集student
和section
参与一个联系集takes
我们也许希望在这个联系中用一个描述性属性grade
,来记录学生在这门课中取得的成绩。我们同样可以用一个描述性的属性for_credit
来记录学生在这门课中是选修还是旁听(或出席)的情况。
给定的联系集中的一个联系实例必须是由其参与实体唯一标识的,而不必使用描述属性。为了理解这一点,假设我们要对一个教师成为一个特定学生的导师的所有日期建模。单值的属性dae
只能保存一个日期。我们不能通过同一个教师和学生之间的多个联系实例来表示多个日期,因为这些联系实例仅使用参与的实体是无法唯一标识的。正确的处理方法是创建一个多值属性dae
,它可以保存所有的日期。
二元联系集
联系集advisor
和dept_advisor
给出了二元( binary
)联系集的例子,即涉及两个实体集的联系集。数据库系统中的大部分联系集都是二元的。然而,有时联系集会涉及多于两个实体集。
例如,假设我们有一个代表在大学内开展的所有研究项目的实体集project
,考虑实体集instrustor
、student
和project
每个项目可以有多个参与的学生和多个参与的教师。另外,每个参与项目的学生必须有一个教师指导他在项目中的工作。目前,我们忽略项目和教师以及项目和学生这两个关联,而关注哪个教师在一个特定项目上指导哪个学生。为了表达这个信息,我们通过关联proj_ guide
将三个实体集联系到一起,它表示某个学生
在某个项目上
接收了某个教师
的指导。
注意,一个学生可以在不同的项目中有不同的教师作为导师,不能将这个联系描述成学生与教师之间的二元关系。
度
参与联系集的实体集的数目称为联系集的度( degree
)。二元联系集的度为2;三元联系集的度为3。