采用E-R模型进行数据库的概念设计,可以分成3步进行:首先设计局部E-R模型,然后把各局部E-R模型综合成一个全局E-R模型,最后对全局E-R模型进行优化,得到最终的E-R模型,即概念模型。
01、局部E-R模型设计
设计局部E-R模型,关键是确定:
(1)一个概念是用实体还是属性表示?
(2)一个概念是作实体的属性还是联系的属性?
1.实体和属性的数据抽象
实体和属性在形式上并无可以明显区分的界限,通常是按照现实世界中事物的自然划分来定义实体和属性,将现实世界中的事物进行数据抽象,得到实体和属性。数据抽象一般有分类和聚集两种,通过分类抽象出实体,通过聚集抽象出实体的属性。
(1)分类
定义某一类概念作为现实世界中一组对象的类型,将一组具有某些共同特性和行为的对象抽象为一个实体。
例如,“李明”是学生当中的一员,具有学生们共同的特性和行为,如在哪个系、学习哪个专业、年龄是多大等,那么,这里的“学生”就是一个实体,“李明”则是学生实体的一个具体对象。
(2)聚集
定义某个类型的组成成分。将对象的组成成分抽象为实体的属性。
例如,学号、姓名、性别等都可以抽象为学生实体的属性。
2.实体和属性的取舍
实体和属性是相对而言的,往往要根据实际情况进行必要的调整,在调整时要遵守两条原则:
(1)属性不能再具有需要描述的性质,即属性必须是不可分的数据项,不能再由另一些属性组成。
(2)属性不能与其它实体具有联系,联系只发生在实体之间。
符合上述原则的事物一般作为属性对待。为了简化E-R图的处理,现实世界中的事物凡能够作为属性对待的,应尽量作为属性。
例如,具有属性雇员编号、姓名和电话的实体雇员。这里的电话也可以作为一个单独的实体,它具有属性电话号码和地点(地点是电话所处于的办公室或家庭住址,如果是移动电话则可以用“移动”来表示)。如果采用这样的观点,则雇员实体就必须重新定义如下:
① 实体雇员,具有属性雇员编号和姓名。
② 实体电话,具有属性电话号码和地点。
③ 联系雇员-电话,表示员工及其电话间的联系。
这两种定义如图8-11(a)和8-11(b)所示。
员工的这两个定义主要差别是什么呢?将电话作为一个属性,表示对于每个员工来说,正好有一个电话号码与之相联系;将电话看成一个实体,就允许每个员工可以有几个电话号码与之相联系,而且可以保存关于电话的额外信息,如它的位置,或类型(移动、视频的或普通电话),这种情况,把电话视为一个实体比把它视为一个属性的方式更具有通用性。
3.属性在实体与联系间的分配
当多个实体用到同一属性时,将导致数据冗余,从而可能影响存储效率和完整性约束,因而需要确定把它分配给哪个实体。一般把属性分配给那些使用频率最高的实体,或分配给实体值少的实体。例如,“课名”属性,不需要在“学生”和“课程”实体中都出现,一般将其分配给“课程”实体作属性。
有些属性不宜归属于任一实体,只说明实体之间联系的特性。例如,某个学生选修某门课的“成绩”,即不能归为“学生”实体的属性,也不能归为“课程”实体的属性,应作为“选课”联系的属性,如图8-12所示。
4.局部E-R模型设计过程
局部E-R模型的设计过程如8-13所示。
▍图8-13 局部E-R模型设计
(1)确定局部结构范围
设计各个局部E-R模型的第一步是确定局部结构的范围划分,划分的方式一般有两种。
① 一种是依据系统的当前用户进行自然划分。
例如,对一个企业的综合数据库,用户有企业决策层、销售部门、生产部门、技术部门和供应部门等,各部位对信息内容和处理的要求明显不同,因此,应为他们分别设计各自的局部E-R模型。
② 另一种是按用户要求数据库提供的服务归纳成几类,使每一类应用访问的数据显著不同于其他类,然后为每类应用设计一个局部E-R模型。
例如,学校的教师数据库可以按提供的服务分为以下几类。
① 教师的档案信息(如姓名、年龄、性别和民族等)的查询分析。
② 对教师专业结构(如毕业专业、现在从事的专业及科研方向等)进行分析。
③ 对教师的职称、工资变化的历史分析。
④ 对教师的学术成果(如著译、发表论文和科研项目获奖情况)查询分析。
这样做的目的是为了更准确地模仿现实世界,以减少统一考虑一个大系统所带来的复杂性。
局部结构范围的确定要考虑下述因素。
① 范围划分要自然,易于管理。
② 范围之间的界面要清晰,相互影响要小。
③ 范围的大小要适度。太小了,会造成局部结构过多,设计过程繁杂,综合困难;太大了,则容易造成内部结构复杂,不便于分析。
(2)实体定义
实体定义的任务就是从信息需求和局部范围定义出发,确定每一个实体的属性和键。
实体确定之后,它的属性也随之确定。对实体命名并确定其键也是很重要的工作。命名应反映实体的语义性质,见名知意,在一个局部结构中应是唯一的;键可以是单个属性,也可以是属性的组合。
(3)联系定义
E-R模型的“联系”用于刻画实体之间的关联。
一种完整的方式是依据需求分析的结果,考察局部结构中任意两个实体之间是否存在联系。若有联系,进一步确定的是1:n、m:n还是1:1。还要考察一个实体内部是否存在联系,两个实体之间是否存在联系,多个实体之间是否存在联系等等。
在确定联系时,应注意防止出现冗余的联系(即可从其它联系导出的联系),如果存在,要尽可能地识别并消除这些冗余联系,以免将这些问题遗留给综合全局的E-R模型阶段。图8-14所示的“教师与学生之间的授课联系”就是一个冗余联系。
(4)属性分配
实体与联系都确定下来后,局部结构中的其他语义信息大部分可用属性描述。这一步工作有两个:一是确定属性;二是把属性分配到有关实体和联系中去。
02、全局E-R模型设计
所有E-R模型都设计好后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部E-R模型,而且必须合理地表示一个完整、一致的数据库概念结构。全局E-R模型的设计过程如图8-15所示。
▍图8-15 全局E-R模型设计
1.确定公共实体
为了给多个局部E-R模型的合并提供开始合并的基础,首先要确定各局部结构中的公共实体。
确定公共实体并非一目了然。特别是当系统较大时,可能有很多局部模式,这些局部E-R模型是由不同的设计人员确定的,因而对同一现实世界的对象可能给予不同的描述。有的作为实体,有的又作为联系或属性。即使都表示成实体,实体名和键也可能不同,这种情况,一般把同名实体作为公共实体的一类候选;把具有相同键的实体作为公共实体的另一类候选。
2.局部E-R模型的合并
对于各局部E-R模型,需要合并成一个整体的全局E-R模型。一般来说,合并可以有两种方式:
(1)多个局部E-R图一次合并,如图8-16(a)所示。
(2)逐步合并,用累加的方式一次合并两个局部E-R图,如图8-16(b)所示。
▍图8-16 局部E-R图合并的两种方式
合并的顺序有时影响处理效率和结果。建议的合并原则是逐步合并:首先进行两两合并,先合并那些现实世界中有联系的局部结构;合并从公共实体开始,最后再加入独立的局部结构。
3.消除冲突
由于各类应用不同,不同的应用通常又由不同设计人员设计成局部E-R模型,因此局部E-R模型之间不可避免地会有不一致的地方,称之为冲突。
各局部E-R图之间的冲突主要有三类:属性冲突、命名冲突和结构冲突。
(1)属性冲突
属性冲突又包括属性域冲突和属性取值单位冲突。
① 属性域冲突。即属性值的类型、取值范围或取值集合不同。
例如职工号,有的部门把它定义为整数,有的部门把它定义为字符型。不同部门对职工号编码也不同,如“1001”或“RS001”,都表示人事部门“1”号职工的职工号。又如年龄,某些部门以出生日期形式表示职工的年龄,而另一些部门用整数表示职工的年龄。
② 属性取值单位冲突。
例如重量单位有的用公斤,有的用斤,有的用克。
属性冲突理论上好解决,通常采用讨论、协商等行政手段解决,但实际上需要各部门讨论协商,解决起来并非易事。
(2)命名冲突
命名冲突包括同名异义和异名同义两种情况。
① 同名异义。即不同意义的对象在不同的局部应用中具有相同的名字。
例如局部应用A中将教室称为房间,局部应用B中将学生宿舍也称为房间。
② 异名同义。即同一意义的对象在不同的局部应用中具有不同的名字。
例如对科研项目,财务处称为项目,科研处称为课题,生产管理处称为工程。
命名冲突包括属性名、实体名、联系名之间的冲突。其中属性的命名冲突更为常见。处理命名冲突通常也采用讨论、协商等行政手段解决。
(3)结构冲突
结构冲突分为三种情况,分别是同一对象在不同应用中具有不同的抽象、同一实体在不同局部E-R图中所包含的属性个数和属性排列次序不完全相同、实体间的联系在不同的局部E-R图中为不同类型。
① 同一对象在不同应用中具有不同的抽象。
例如,职工,在某个应用中为实体,而在另一应用中为属性。
解决方法:通常是把属性变换为实体或实体变换为属性,使同一对象具有相同的抽象。
② 同一实体在不同局部E-R图中所包含的属性个数和属性排列次序不完全相同。
解决方法:使该实体的属性取各局部E-R图中属性的并集,再适当调整属性的次序。
③ 实体间的联系在不同的局部E-R图中为不同类型。
例如实体E1与E2在一个局部E-R图中是多对多联系,在另一个局部E-R图中是一对多联系;又如在一个局部E-R图中E1与E2发生联系,而在另一个局部E-R图中E1、E2和E3三者之间发有联系。
解决方法:根据应用的语义对实体联系的类型进行综合或调整。
【例8-5】分析下面所给的两个局部E-R图存在的冲突。
设有如下实体:
学生:学号、单位名称、姓名、性别、年龄、选修课程名、平均成绩。
课程:课程号、课程名、开课单位、任课教师号。
教师:教师号、姓名、性别、职称、讲授课程号。
单位:单位名称、电话、教师号、教师姓名。
上述实体中存在如下联系:
(1)一个学生可选修多门课程,一门课程可为多个学生选修;
(2)一个教师可讲授多门课程,一门课程可为多个教师讲授;
(3)一个系可有多名教师,一个教师只能属于一个系。
根据上述约定,可以得到学生选课局部E-R图和教师授课局部E-R图,如图8-17(a)和8-17(b)所示。
解答:
(1)这两个局部E-R图中存在着异名同义的命名冲突。
学生选课局部E-R图中的实体“系”与教师任课局部E-R图中的实体“单位”都是指“系”,合并后统一改为“系”。
学生选课局部E-R图的属性“名称” 和教师任课局部E-R图的属性“单位名称”都是指“系名”,合并后统一改为“系名”。
(2)存在着结构冲突。
实体“系”和实体“课程”在两个局部E-R图中的属性组成不同,合并后这两个实体的属性组成为各局部E-R图中的同名实体属性的并集。即实体“系”的属性有系名、电话;实体“课程”的属性有课程号、课程名和教师号。
解决上述冲突后,合并两个局部E-R图,生成初步的全局E-R图如图8-18所示。
4.全局E-R模型的优化
在得到全局E-R模型后,为了提高数据库系统的效率,还应进一步依据处理需求对E-R模型进行优化。一个好的全局E-R模型,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体的个数尽可能少,实体所含属性个数尽可能少,实体间联系无冗余。
但是,这些条件不是绝对的,要视具体的信息需求与处理需求而定。下面给出几个全局E-R模型的优化原则。
(1)实体的合并
这里的合并是指相关实体的合并。在信息检索时,涉及到多个实体的信息要通过连接操作获得。因而减少实体个数,可减少连接的开销,提高处理效率。
一般在权衡利弊后,可以把1:1联系的两个实体合并。
(2)冗余属性的消除
通常在各个局部结构中是不允许冗余属性存在的,但在综合成全局E-R模型后,可能产生全局范围内的冗余属性。
例如,在教育统计数据库的设计中,一个局部结构含有高校毕业生数、招生数、在校学生数和预计毕业生数,另一局部结构中含有高校毕业生数、招生数、分年级在校学生数和预计毕业生数。各局部结构自身都无冗余,但综合成一个全局E-R模型时,在校学生数即成为冗余属性,应予以消除。
一个属性值可从其他属性的值导出来,所以应把冗余的属性从全局模型中去掉。
冗余属性消除与否,也取决于它对存储空间、访问效率和维护代价的影响。有时为了兼顾访问效率,有意保留冗余属性。这当然会造成存储空间的浪费和维护代价的提高。
(3)冗余联系的消除
在全局模型中可能存在有冗余的联系,通常利用规范化理论中函数依赖的概念消除冗余。
【例8-6】对例8-5得到的初步E-R图进行优化。
分析:
① 消除冗余属性“课程”实体中的属性“教师号”,因为“课程”实体中的属性“教师号”可由“讲授”这个联系导出;
② 消除冗余属性“学生”实体中的属性“平均成绩”,因为平均成绩可由“选修”联系中的属性“成绩”经过计算得到;
③ 消除冗余联系“开设”,因为该联系可以通过“系”和“教师”之间的“属于”联系与“教师”和“课程”之间的“讲授”联系推导出来。
最后优化后得到的全局E-R图如图8-19所示。