实体-联系数据模型(E - R数据模型)被开发来方便数据库的设计,它是通过允许定义代表数据库全局逻辑结构的企业模式( enterprise schema )来做到的。 一个实体( entity )是现实世界中可区别于所有其他对象的一个“事物或“对象”。例如,大学中的每个人都是一个实体。每个实体有一组性质,并且某些性质集合的值必须唯一地标识一个实体。例如,一个人可能具有 person_id 性质,其值唯一标识了这个人。因此, person_id 的值677-89-9011将唯一标识出大学中一个特定的人。类似地,课程也可以被看作实体,并且 course_id 唯一标识出了大学中的某个课程实体。实体可以是实实在在的,比如一个人或一本书;实体也可以是抽象的,比如课程、开设的课程段或者航班预订。 联系( relationship )是多个实体间的相互关联。例如,我们可以定义关联 Katz 教师和 Shankar 学生的 advisor 联系。这一联系指明 Katz 是学生 Shankar 的导师。联系集( relationship set )是相同类型联系的集合。 E - R 模式中的一个联系实例( relationship instance )表示在所建模的现实企业中被命名的实体之间的一种关联。作为一个示例,一位教师 ID 为45565的 instructor 实体 Katz 和一名学生 ID 为12345的 student 实体 Shankar ,都参与到 advisor 的一个联系实例中。这一联系实例表示在大学中 Katz 教师指导 Shankar 学生。 联系集在 E - R 图中用菱形表示,菱形通过线条连接到多个不同的实体集(矩形)。下图中的 E - R 图显示了通过二元联系集 advisor 关联的 instructor 和 student 两个实体集。 作为另一个示例,考虑 student 和 section 两个实体集,其中 section 表示ー门课的一次开课。我们可以定义 takes 联系集来表示学生及其所选课程段之间的关联。 尽管在前面的示例中,每个联系集都是两个实体集之间的关联,但一般来说,联系集可以表示两个以上实体集的关联。 形式化地说,联系集是在n≥2个(可能相同的)实体集上的数学关系。如果 E1 , E2 ,… ,En 为实体集,那么联系集 R 是 实体集之间的关联被称为参与,即实体集 E1 , E2 ,… ,En参与( participate )联系集 R 。 实体在联系中扮演的功能被称为实体的角色( role )。由于参与一个联系集的实体集通常是互异的,因此角色是隐含的并且一般并不指定。但是,当联系的含义需要解释时角色是有用的。当参与联系集的实体集并非互异时就是这种情况;也就是说,同样的实体集以不同的角色多次参与一个联系集。在这类联系集中,有必要用显式的角色名来指明实体是如何参与联系实例的,这类联系集有时被称作递归的( recursive )联系集。例如,考虑记录大学中所开设的所有课程的信息的 course 实体集。我们用 course 实体的有序对来建模联系集 prereg ,以描述一门课程(C2)是另一门课程(C1)的先修课。每对课程中的第一门课程扮演C1课程的角色,而第二门课程扮演C2先修课的角色。按照这种方式,所有的 prereq 联系通过(C1,C2)对来表示,排除了(C2,C1)对。在 E - R 图中,我们通过在菱形和矩形之间的连线上进行标注来表示角色。下图给出了 course 实体集和 prereq 联系集之间的角色标识 course_id 和 prereg_id 。 联系也可以具有被称作描述性属性( descriptive attribute )的属性。作为联系的描述性属性的示例,考虑与 student 和 section 实体集相关联的 takes 联系集。我们可能希望存储联系的描述性属性 grade ,以记录学生在开设的课程中获得的成绩。 联系集的属性在 E - R 图中通过未分割的矩形来表示。我们用虚线将此矩形与表示该联系集的菱形相连接。例如,下图显示了 section 和 student 实体集之间的 takes 联系集。我们将描述性属性 grade 附加到 takes 联系集上。一个联系集可以具有多个描述性属性;例如我们还可以在 takes 联系集上存储描述性属性 for_credit ,以记录学生选这门课是为了修学分,或是旁听这门课程(或非正式地随班听课)。 复杂的 E - R 设计可能需要拆分成多张可能位于不同页面的图。联系集应仅显示在一个位置,但实体集可以在不止一个位置重复出现。实体集的属性应在第一次出现时显示。后续出现的实体集应显示为不带属性的,以避免重复信息以及由此产生的在不同出现中显示的属性不一致的可能性。 相同的实体集可能会参与到多个联系集中。例如,假设学生可能是某门课程的助教。那么,除了参与 takes 联系集之外, section 和 student 实体集还可能参与 teaching assistant 联系集。 我们之前看到的联系集的形式化定义将联系集定义为联系实例的集合。考虑 student 和 section 之间的 takes 联系。由于集合不能有重复项,因此一名特定学生只能与 takes 联系中的一个特定课程段有一个关联。从而,一名学生只能有一个与某课程段相关联的成绩,在这种情况下这是有意义的。但是,如果我们希望允许一名学生在同一课程段上取得不止一个成绩,我们需要有一个 grades 属性来存储一组成绩;这些属性称为多值属性,我们将在后面看到它们。 advisor 和 takes 联系集给出了二元联系集( binary relationship set )的示例,即涉及两个实体集的联系集。数据库系统中的大部分联系集都是二元的。然而,有时联系集会涉及多于两个实体集。参与联系集的实体集的数目是联系集的度( degree )。二元联系集的 为2;三元联系集( ternary relationship set )的度为3。 作为一个示例,假设我们有一个代表大学内开展的所有研究项目的 project 实体集,考虑 instrustor 、student 和 project 实体集。每个项目可以有多名参与的学生和多位参与的教师。另外,在项目中工作的每名学生必须有一位相关教师来指导该生在项目中的工作。目前,我们忽略项目和教师之间以及项目和学生之间的前两个联系,而关注在一个特定项目上由哪位教师指导哪名学生。 为了表示这些信息,我们通过 proj_guide 三元联系集将三个实体集联系到一起,它关联 instructor 、 student 和 project 实体集。 proj_guide 的实例表示在一个特定项目上一名特定学生接受了一位特定教师的指导。注意,一名学生在不同项目中可以由不同教师指导,不能将这个联系描述成学生与教师之间的二元关系。 非二元的联系集也可以在 E - R 图中容易地表示。下图展示了三元联系集 proj_guide 的 E - R 图表示形式。 复杂属性 对于每个属性都有一个可取值的集合,称为该属性的域( domain ),或者值集( value set )course_id 属性的域可能是特定长度的所有文本字符串的集合。类似地, semester 属性的域能是集合{秋,冬,春,夏}中的字符串。 简单( simple )和复合( composite )属性。迄今为止在我们的示例中出现的属性都是简单的,也就是说,它们不能被划分为子部分。而复合属性可以被划分为子部分(即其他属性)。例如, name 属性可被构建为一个包括 first_name 、middle_initial和last_name的复合属性。如果用户希望在一些场景中引用整个属性,而在另外的场景中仅引用属性的一部分,则在设计模式中使用复合属性是一种好的选择。假设我们要给 student 实体集增加一个地址。地址可被定义为具有 street、city、state和postal_code属性的复合属性address 。复合属性帮助我们把相关属性集合起来,使模型更清晰。 单值( single - valued )和多值( multivalued )属性。我们示例中的属性对一个特定实体都只有单独的一个值。例如,对某个特定的学生实体而言, student_ID 属于一个学生 ID 。这样的属性被称作是单值的。而在某些实例中,对一个特定实体而言,一个属性可能对应于一组值。假设我们往 instructor 实体集中添加一个number 属性,每位教师可以有零个、一个或多个电话号码,不同的教师可以有不同数量的电话号码。这种类型的属性被称作是多值的。作为另一个示例,我们往 instructor 实体集中添加一个dependent_name属性,它列出所有的家属姓名。这个属性将是多值的,因为任何一位特定的教师可能有零个、一个或多个家属。 派生属性( derived atribute )。这类属性的值可以从其他相关属性或实体的值派生出来。例如,假设 instructor 实体集有一个 students_advised 属性,它表示一位教师指导了多少名学生。我们可以通过统计与一位教师相关联的所有 student 实体的数目来导出这个属性的值。 这里具有成员属性 first_name 、middle_initial和last_name的复合属性 name 代替了 instructor 的简单属性 name 。作为另一个示例,假定我们给 instructor 实体集增加一个地址。地址可以被定义为具有 street 、city 、state和postal_code属性的复合属性 address 。 street 属性本身也是一个复合属性,其成员属性为street_number、street_name和apartment_number 。该图还给出了一个由“ {phone_number)”表示的多值属性phone_number ,以及一个由“age”表示的派生属性age。 当实体在某个属性上没有值时认为该属性取空( null )值。空值可以表示“不适用”,即该实体的这个值不存在。例如,没有中间名的人可以将middle_initial 属性设置为空。空还可以表示属性值是未知的。未知的值要么是缺失的(值存在,但我们没有该信息),要么是不知道的(我们并不知道该值是否确实存在)。 例如,如果一位特定教师的 name 值为空,我们推测这个值是缺失的,因为每位教师肯定有一个名字。 apartment_number 属性的空值可能意味着地址中没有包括公寓号(不适用),公寓号是存在的但是我们并不知道是什么(缺失的),或者我们不知道公寓号是否是该教师地址的一部分(不知道的)。 映射基数 映射基数(mapping cardinality)或基数比率表示一个实体能通过一个联系集关联的另一些实体的数量。映射基数在描述二元联系集时最有用,尽管它们可用于描述涉及多于两个实体集的联系集。 一对一( one - to - one )。 A 中的一个实体至多与 B 中的一个实体相关联,并且 B 中的一个实体也至多与 A 中的一个实体相关联。 一对多( one - to - many )。 A 中的一个实体可以与 B 中任意数量(零个或多个)的实体相关联,而 B 中的一个实体至多与 A 中的一个实体相关联。 多对一( many - to - one )。 A 中的一个实体至多与 B 中的一个实体相关联,而 B 中的一个实体可以与 A 中任意数量(零个或多个)的实体相关联。 多对多( many - to - many )。 A 中的一个实体可以与 B 中任意数量(零个或多个)的实体相关联,而且 B 中的一个实体也可以与 A 中任意数量(零个或多个)的实体相关联。 一个特定联系集的适当的映射基数显然依赖于该联系集所建模的现实世界的情况。 一对一( one - to - one )。我们从联系集到两个实体集各画一条有向线段。例如,在图7-11a中,指向 instructor 和 student 的有向线段表示一位教师最多可以指导一名学生,并且一名学生最多可以有一位导师。 一对多( one - to - many )。我们从联系集到联系的“一”侧画一条有向线段。因此,在图7-11b中,有一条从 advisor 联系集到 instructor 实体集的有向线段,以及一条到 student 实体集的无向线段。这表示一位教师可以指导多名学生,但一名学生最多只能有一位导师。 多对一( many - to - one )。我们从联系集到联系的“一”侧画一条有向线段。因此,在图7-11c中,有一条从 advisor 联系集到 instructor 实体集的无向线段,以及一条到 student 实体集的有向线段。这表示一位教师最多可以指导一名学生,但一名学生可以有多位导师。 多对多( many - to - many )。我们从联系集到两个实体集各画一条无向线段。因此,在图7-11d中,从advisor联系集到instructor和student实体集都有无向线段。这表示一位教师可以指导多名学生,并且一名学生可以有多位导师。 如果实体集 E 中的每个实体都必须参与到联系集 R 中的至少一个联系中,那么实体集 E 在联系集 R 中的参与就被称为是全部的。如果 E 中一些实体可能不参与到 R 的联系中,那么实体集 E 在联系集 R 中的参与就被称为是部分的。 例如,一所大学可能要求每名学生至少有一位导师;在 E - R 模型中,这相当于要求每个 student 实体通过 advisor 联系至少与一位教师相关联。因而, student 在 advisor 联系集中的参与是全部的。而一位教师不是必须要指导学生。因此,可能只有某些 instructor 实体通过 advisor 联系同 student 实体集相关联,那么 instructor 在 advisor 联系集中的参与是部分的。我们用双线表示一个实体在联系集中的全部参与。 E - R 图还提供了一种方式来描述更复杂的约束,这种约束限制了每个实体参与联系集中的联系的次数。线段上可以有一个关联的最小和最大基数,用l…h的形式表示,其中l表示最小基数, h 表示最大基数。最小值为1表示实体集全部参与联系集,即实体集中的每个实体在该联系集中的至少一个联系中出现。最大值为1表示实体至多参与一个联系,而最大值为*代表没有限制。 例如,考虑下图。 advisor 和 student 之间的线段有1…1的基数约束,这意味着基数的最小值和最大值都是1。也就是说,每名学生必须有且只有一位导师。 advisor 和 instructor 之间的线段有0.*的限制,说明一位教师可以有零名或多名学生。因此, advisor 联系是从 instructor 到 student 的一对多联系,更进一步地讲, student 在 advisor 中的参与是全部的,这意味着一名学生必须有一位导师。 很容易将左侧的边上的0…曲解为advisor 联系是从 instructor 到 student 的多对一联系,这正好和正确的解释相反。 如果两条边都有最大值1,那这个联系是一对一的。如果我们在左侧的边上指定基数限制为1…,就可以说每位教师必须指导至少一名学生。 上图中的 E - R 图的另一种替代方式是画一条从 student 到 advisor 的双线,以及一个从 advisor 到 instructor 的箭头,来替换所显示的基数约束。这种替换方式可以强制实施同图中所示约束完全一样的约束。 在非二元的联系集中,我们可以指定多对一联系的某些类型。假设一名学生在一个项目上最多只能由一位教师指导。这种约束可以通过从 proj_guide 指向 instructor 的箭头来表示。 我们至多允许一个箭头从一个非二元的联系集指出,因为在 E - R 图中,从一个非二元联系集指出两个或更多的箭头可以用两种方式来解释。 (责任编辑:) |