来源:《Database System Concepts》,
作者:
亚伯拉罕Silberschatz耶鲁大学
亨利·科尔斯·列高大学
孟买,S.苏达山印度理工学院
7.7实体关系设计问题
实体集和关系集的概念是不精确的,定义一组实体和它们之间的关系可能有很多不同的方法。在这一章节,我们用数据库模式中的E-R图来研究其中的基本问题。7.10章节中包含了更详细的E-R图设计过程。
7.7.1 实体集与其相对属性的使用
考虑到带有电话号码附加属性的教师这一实体集。这可能很容易被争议电话是一个独立的实体因为它有属性电话号码和位置;位置可能是电话所在的办公室或家庭,是通过“移动”这一确切涵义来大概描述移动电话的。如果我们采用这种观点,我们将不把属性电话号码添加到教师上。相反,我们创建:
一个有属性电话号码和位置的电话实体集
一个inst电话关系集,表明教师和他们的电话之间的联系
这个供替代的选择如图7.17 b所示。
那么,一个教师的这两个属性之间主要的区别是什么呢?将一个电话当作属性(电话号码)意味着每一个教师都有一个准确的电话号码。将一个电话当作一个实体(电话)意味着和教师相连的有几个电话号码(包括没有)。可是,我们可以很容易地将电话号码定义为一个多值属性,以允许每个教师使用多个电话。主要的区别在于,把手机当作一个实体更好地模拟一个人可能想要保留关于手机额外的信息的情况,比如它的位置,或者它的类型(移动电话,IP电话,或者普通的老式电话),或者所有共享这个手机的人。因此,将电话视作一个实体比将它视作一个属性更普遍,并且在一般性可能有用的情况下是合适的。
相反,将属性名(教师)视为一个实体是不合适的; 很难去争论他的名字是一个独立的实体(与电话相比)。因此,将名字作为教师实体集的属性是合适的。
由此产生了两个本质问题:属性由什么组成;实体集由什么组成?不幸的是,这里没有简单的答案。区别主要在于现实生活中企业的建模结构,以及与所讨论的属性相关的语义。
一个常见的错误是使用实体集的主键作为另一个实体集的属性,而不是使用关系。例如,将学生的ID建模为教师的属性是不正确的,即使每个教师只教一个学生。关系顾问是表示学生和教师之间联系的正确方式,因为它使他们之间的关系明确,而不是通过属性来暗示。
人们有时会犯的另一个相关的错误是将相关实体集的主键属性指定为关系集的属性。例如,ID(学生的主键属性)和ID(教师的主键)不应该作为关系顾问的属性出现。这是不应该做的,因为主键属性已经隐含在关系集中了。
7.7.2实体集与关系集的使用
一个对象是否由一个实体集或一个关系集来表示并不总是很清楚。在图7.15中,我们使用关系集对一个学生的课程情况建立模型。另一种选择是设想每个学生选的每门课程都有相应的课程注册记录。此外,我们有一个实体集来描述这个课程记录。让我们称它为实体集注册。每一个注册实体准确的和每个学生和部门有密切的关系。因此我们有两个关系集,一个是课程注册记录和学生的关系,另一个是课程注册记录与部门的关系。在图7.18中,我们显示了来自图7.15的实体集部门和学生中关系集被一个实体集和两个关系集替换:
注册,实体集表示课程注册记录
部门注册,关系集联系课程和注册
学生注册,关系集联系学生和注册
注意,我们使用双行来表示区域实体的完全参与
图7.15和图7.18的方法准确地体现的大学的信息,但是使用更简洁的方法可能更好。然而,如果注册处的办公室将其他信息与课程注册记录联系在一起,那么最好是将它作为一个实体。决定是否使用实体集或关系集的一个可能的指导原则是指定一个关系集,以描述实体之间发生的行为。这种方法也可以用于确定某些属性是否更合适表达关系。
7.7.3二元与n-ary关系集
数据库中的关系通常是二元的。然而一些看似不是二元关系事实上却可以通过一些二元关系更好的表现出来。例如,一个人创造了一个三元关系的父母亲,把孩子和他/她的母亲和父亲联系起来。然而这样的关系也可以用这两种二元关系来表示,父亲和母亲,分别是这个孩子和他妈妈爸爸的关系。使用这两种关系,母亲和父亲为我们提供了一个孩子的母亲的记录,即使我们没有意识到父亲的省份,如果使用三元关系,则需要一个空值。在这个情况下使用二进制关系集更可取。
事实上,总是可以使用许多不同的二元关系集来替换非二元关系。为简单起见,考虑抽象三元组关系集R,关联实体集A、B和C。我们用一个实体的集合E替换关系集R,并创建三个关系集,如图7.19所示:
如果关系集R有任何属性,那么这些属性被赋给实体集合E;此外,为E创建了一个特殊的识别属性(因为必须能够根据属性值来区分实体中不同的实体)。对于关系集合R中的每一个关系(ai,bi,ci),我们在实体集合中创建一个新的实体ei,然后,在这三个新的关系集合中,我们插入的一个关系如下:
• RA,relating E and A.
• RB, relating E and B.
• RC, relating E and C.
我们可以用简单明了的方式来概括这个过程。因此,从概念上讲,我们可以限制E-R模型只包含二元关系集。然而,这种限制并不总是可取的。
•必须为创建的实体集创建一个标识属性,以表示关系集。该属性以及所需的额外关系集,增加了设计的复杂性,(如我们将在第7节中看到的)总体存储需求。
•一个n-ary关系集更清楚地显示了几个实体参与了一个单一的关系。
•可能没有一种方法可以把三元关系中的约束转换成二进制关系的约束。例如,考虑一个约束条件,就是说R是从A到B,从B到C;也就是说,每一对来自A和B的实体在大多数的oneC实体中都存在。这种约束不能通过在关系集RA、RB和andRC上的基数约束来表示。
请考虑第7.2节中的关系集proj指南,相关的讲师、学生和项目。我们不能直接把工程指南分割成教师与项目之间、教师与学生之间的二元关系。如果我们这样做, 我们可以记录下,导师Katz与学生Shankar和Zhang一起工作的项目A和B;但是,我们不能记录Katz与学生Shankar一起在A项目上工作,并且和学生张一起在B项目上工作,但是在A项目A项目B和Shankar没有合作。
通过创建如上所述的新实体集,关系建立工程指南可以被分割成二元关系。然而,这样做并不十分自然。
7.7.4 关系属性的放置
关系属性的基数比可以影响关系属性的放置因此,一对一或一对多关系集的属性与一个参与的实体集有关,而不是与关系集有关。例如,让我们假设咨询者是一个一对多的关系集,一个指导者可能可以指导一些学生,但是每个学生只可以被一个指导员指导。子本例中,属性date说明了何时成为学生的顾问,这可以与学生实体集相联系,如图7.20所示。由于每个学生实体都参与最多一个指导教师的关系,因此,使这个属性名称与有advisor关系集的date有了相同的意义。一对多关系集的属性可以重新定义到“多”方面的实体。另一方面,对于一对一关系,关系属性可以与参与的其中一个实体相关联。
在这种情况下,何处放置描述属性的设计决策——作为关系或是实体属性——应该反应除被建企业的特征。设计者可以选择保留date作为advisor的一个属性,明确表示出date代表的是顾问的关系,而不是大学学生其他方面的属性(例如,大学的录取时间)
对于多对多的关系集,属性放置的选择显得更加的明确。让我们回到刚才那个例子,让我具体说明更可能发生的情况,一个指导员可能可以指导一个或多个学生,而一个学生也可以选择一个或多个指导员。如果我们要将date表达成一个指导员成为一个专项学生的专项顾问,那么date一定会是advisor的一个属性,而不是每一个参与实体的属性。如果date是student的一个属性,例如,我们将不能决定那个指导员在特定日期成为指定中的顾问。当一个属性由实体集决定,而不是单独的实体决定时,那么这个属性一定与多对多关系集相联系。7.3描述的date作为关系属性时地放置,同样的,为了保持图的简介性,只显示了两个实体集的一些属性。