数据库之数据库设计和E-R模型

本篇文章介绍数据库设计和E-R模型,内容基本是笔者在学习《数据库系统概念》时摘抄总结而来,仅作笔记。

实体-联系模型

实体-联系(entity-relationship,E-R)数据模型的提出旨在方便数据库的设计,它是通过允许定义代表数据库全局逻辑结构的企业模式实现的。E-R数据模型采用了三个基本概念:实体集、联系集和属性,我们下面逐一介绍。

实体集

实体(entity)是现实世界中可区别于所有其他对象的一个“事物”或“对象”。例如,每个城市都是一个实体。每个实体有一组性质,其中一些性质的值可以唯一的标识一个实体。例如,一个城市的city_id可以唯一标识这个城市。与此类似,我们每个人都是一个实体,身份证也唯一标识了我们中的某个实体。实体可以是实实在在的,例如人;也可以是抽象的,例如城市。

实体集(entity set)是相同类型即具有相同性质(或属性)的一个实体集合。例如,一个给定省份的所有城市的集合可定义为实体集city。

实体通过一组属性(attribute)来表示。属性是实体集中每个成员所拥有的描述性性质。为某实体集指定一个属性表名数据库为该实体集中每个实体存储相似的信息;但每个实体在每个属性上都有各自的值。每个实体的每个属性都有一个值(value)。例如一个特定的city实体可能city_id为131000,city_name的值为石家庄。

数据库包括一组实体集,每个实体集包括任意数量的相同类型的实体。

联系集

联系集(relationship)是指多个实体间的相互关联。例如,我们可以定义关联省份province和城市city的联系。

联系集(relationship set)是相同类型联系的集合。正规的说,联系是n>=2个(可能相同的)实体集上的数学关系。如果E1,E2,...,En为实体集,那么联系集R是

{(e1,e2,...,en)|e1∈E1,e2∈E2,...,en∈En}

的一个子集,而(e1,e2,...,en)是一个联系。

实体集之间的关联称为参与,也就是说,实体集E1,E2,...,En参与(participate)联系集R。E-R模式中的一个联系实例(relationship instance)表示在所建模的现实世界企业中命名实体间的一个关联。例如,一个城市city_id为130201的实体唐山市和一个省份province_id为130000的实体河北省参与到一个联系实例中。

联系也可以具有描述性属性(descriptive attribute),但给定的联系集中的一个联系实例必须是由其参与实体唯一标识的,而不能使用描述属性。

参与联系集的实体集的数目称为联系集的度(degree)。二元联系集的度为2;三元联系集的度为3。

属性

每个属性都有一个可取值的集合,称为该属性的域(domain),或者值集(value set)。例如gender属性的域可能是集合{男,女}中的字符串,而city_id可能是特定长度的所有文本字符串的集合。

正规的说,实体集的属性是将实体集映射到域的函数。由于一个实体集可能有多个属性,因此每个实体都可以用一组(属性,数据值)对来表示,实体集的每一个属性对应一个这样的对。

E-R模型中的属性可以按照如下的属性类型来进行划分:

  1. 简单(simple)和复合(composite)属性。我们平时使用的一般都是简单属性,它们不能划分为更小的部分。而复合属性可以再划分为更小的部分(即其他属性)。例如address属性可以包括province、city和street属性,而street还可以进一步划分为street_number、street_name等,即复合属性室友层次的。
  2. 单值(single-valued)和多值(multivalued)属性:我们平时使用的一般是单值属性,例如city_id只对应一个城市id,这样的属性被称作是单值(single-values)的。而在某些情况下对某个特定实体而言,一个属性可能对应一组值。例如city实体的属性alias可能对应多个,对于成都来说alias属性的值可能会有“蓉城”、“锦城”等。这样的属性称作多值(multivalued)。
  3. 派生(derived)属性:这类属性的值可以从别的相关属性或实体派生出来。例如province实体可以通过统计city表派生出一个拥有多少个城市的属性。

当实体在某个属性上没有值时使用空(null)值。空值可以表示“不适用”,即该实体的这个属性不存在值。

约束

E-R企业模式可以定义一些数据库中的数据必须要满足的约束。

映射基数

映射基数(mapping cardinality)也称为基数比率,表示一个实体通过一个联系集能关联到的实体的个数。

映射基数在描述二元联系集时非常有用,尽管它们可以用于描述设计多于两个实体集的联系集。对于实体集A和B之间的二元联系集R来说,映射基数必然是以下情况之一:

  1. 一对一(one-to-one):A中的一个实体至多与B中的一个实体相关联,并且B中的一个实体也至多与A中的一个实体相关联。
  2. 一对多(one-to-many):A中的一个实体可以与B中的任意数目实体相关联,而B中的一个实体至多与A中的一个实体相关联。
  3. 多对一(many-to-one):A中的一个实体至多与B中的一个实体相关联,而B中的一个实体可以与A中任意数目实体相关联。
  4. 多对多(many-to-many):A中的一个实体可以与B中任意数目实体相关联,而且B中的一个实体也可以与A中任意数目实体相关联。

参与约束

如果实体集E中的每个实体都参与到联系集R的至少一个联系中,实体集E在联系集R中的参与称为全部(total)的。如果E中只有部分实体参与到R的联系中,实体集E到联系集R的参与称为部分(partial)的。

我们必须有一个区分给定实体集中的实体的方法。从概念上来说,各个实体是互异的;但从数据库的观点上来看,它们的区别必须通过其属性来表明。因此,一个实体的属性的值必须可以唯一标识该实体。也就是说,在一个实体集中不允许两个实体对于所有属性都具有完全相同的值。

之前介绍过的关系模式的码可以直接适用于实体集,即实体的码是一个足以区分每个实体的属性集。关系模式中的超码、候选码和主码的概念同样适用于实体集。

实体-联系图

E-R图(E-R diagram)可以图形化表示数据库的全局逻辑结构。

基本结构

E-R图包括如下几个主要构件:

  1. 分成两部分的矩形代表实体集。有阴影的第一部分包含实体集的名字,第二部分包含实体集中所有属性的名字。

ER图实体集

2. 菱形代表联系集。

ER图联系集

3. 未分割的矩形代表联系集的属性。构成主码的属性以下划线标明。

ER图联系集属性

 

4. 线段将实体集连接到联系集。

线段

5. 虚线将联系集属性连接到联系集。

ER图虚线

6. 双线显示实体在联系集中的参与度为完全参与,单线为部分参与。

ER图双线

7. 双菱形代表连接到弱实体集的标志性联系集。

ER图双菱形

映射基数

两个实体集之间的联系集可以是一对一、一对多、多对一或多对多的。为了区别这些类型,在所讨论的联系集和实体集之间画一个箭头或一条线段,其具体功能如下所示(为方便举例,我们使用教师instructor和学生student这两个实体集以及联系集advisor):

  1. 一对一:从联系集advisor向实体集instructor和student各画一个箭头,这表示一名教师至多指导一名学生,并且一名学生至多有一位教师。

一对一

2. 一对多:从联系集advisor向实体集instructoe画一个箭头以及一条线段到实体集student。表示一名教师可以指导多名学生,但一名学生至多有一名教师。

一对多

3. 多对一:从联系集advisor画一条线段到实体集instructor以及一个箭头到实体集student。表示一名教师至多可以教导一名学生,但一名学生可以有多位教师。

多对一

4. 多对多:从联系集advisor到实体集instructor和实体集student各画一条线段。表示一名教师可以教导多名学生,并且一名学生可以有多位教师。

多对多

E-R图还提供了一种描述每个实体参与联系集中的联系的次数的更复杂的约束的方法。实体集和二元联系集之间的一条边可以有一个关联的最大和最小的映射基数,用l.h的形式表示,其中l表示最小的映射基数,而h表示最大的映射基数。最小值为1表示这个实体集在该联系集中全部参与,即实体集中的每个实体在联系集中得至少一个联系中出现。最大值为1表示这个实体参与至多一个联系,而最大值为*代表没有限制。

例如下图中,联系集advisor和实体集student之间的边有1..1的基数约束,意味着基数的最小值和最大值都是1,即每个学生必须有且只能有一个教师。从联系集advisot到实体集instructor边上的基数约束0..*表示一个教师可以有0个或多个学生。因此,advisor联系是从instructor到student的一对多联系,即student在advisor联系中的参与是全部的。

复杂的属性

假如实体集student有一个复合属性address,该属性有包括属性city、area和street,而属性street本身也是一个复合属性,其子属性为street_number、street_name。phone_number是一个多值属性。

复杂属性

弱实体集

没有足够的属性以形成主码的实体集称作弱实体集(weak entity set)。有主码的实体集称作强实体集(strong entity set)。

弱实体集必须与另一个称作标识(identifying)或属主实体集(owner entity set)的实体集关联才能有意义。每个弱实体集必须和一个标识实体关联,即弱实体集存在依赖(existence dependent)于标识实体集。我们称标识实体集拥有(own)它所标识的弱实体集。将弱实体集与其标识实体集相连的联系称为标识性联系(identifying relationship)。

标识性联系是从弱实体集到标识实体集多对一的,并且弱实体集在联系中的参与是全部的。标识性联系集不应该有任何描述性属性,因为这种属性的任意一个都可以与弱实体集相关联。

虽然弱实体集没有主码,但我们仍需要区分依赖于特定强实体集的弱实体集中的实体的方法。弱实体集的分辨符(discriminator)是使得我们进行这种区分的属性集合。弱实体集的分辨符也称为该实体集的部分码。弱实体集的主码由标识实体集的主码加上该弱实体集的分辨符构成。

在E-R图中,弱实体集与强实体集类似,以矩形表示,但有亮点主要区别:

  1. 弱实体集的分辨符以虚下划线标明,而不是实线。
  2. 关联弱实体集和标识性强实体集的联系集以双菱形表示。

弱实体集

弱实体集可以参与标识性联系以外的其他联系。弱实体集可以作为属主与另一个弱实体集参与一个标识性联系。一个弱实体集也可能与不止一个标识实体集关联,一个特定的弱实体将被一个实体的组合标识,其中每个标识实体集有一个实体在该组合中。弱实体集的主码可以由标识实体集的主码的并集加上弱实体集的分辨符组成。

转换为关系模式

我们可以将一个符合E-R数据库模式的数据库表示为一些关系模式的集合。在数据库设计中,对于每个实体集以及对于每个联系集,都有唯一的关系模式与之对应,关系模式名即为相应的实体或联系集的名称。

具有简单属性的强实体集的表示

设E是只具有简单描述性属性a1,a2,...,an的强实体集。我们用具有n个不同属性的模式E来表示这个实体集。该模式的关系中的每个元组同实体集E的一个实体相对应。

对于从强实体集转换而来的模式,强实体集的主码就是生成的模式的主码。

具有复杂属性的强实体集的表示

当一个强实体集具有非简单属性时,不为复合属性自身创建一个单独的属性,而是通过为每个子属性创建一个单独的属性来处理复合属性。例如前面提到过的复合属性address,生成的模式包括属性city,area,street_number和street_name。

对于多值属性的处理不同于其他属性。E-R图中的属性通常可以直接映射到相应的关系模式的属性上,但多值属性不同,为了这些属性,需要创建新的关系模式。

对于一个多值属性M,构建关系模式R,改模式包含一个对应于M的属性A以及对应于M所在的实体集或联系集的主码的属性。例如对于如下E-R图,它描绘了包含多值属性phone_number的实体集student,student的主码是id。

student实体集

为phone_number构建一个关系模式:

student_phone(id,phone_number)

即每个学生的每个电话号码都表示为该模式上的关系中的唯一一个元组。创建关系模式的主码由模式中的所有属性组成。在此例中的主码由两个属性一起构成。另外,在多值属性构建的关系模式上建立外码约束,由实体集的主码所生成的属性去参照实体集所生成的关系。在此例中student_phone关系上的外码约束是属性id参照student关系。

弱实体集的表示

设A是具有属性a1,a2,...,an的弱实体集,设B是A所依赖的强实体集,设B的主码包括属性b1,b2,...,bn。用名为A的关系模式表示实体集A,该模式的每个属性对应以下集合中的一个成员:

{a1,a2,...,an}∪{b1,b2,...bn}

对于弱实体集转换而来的模式,该模式的主码由其所依赖的强实体集的主码与弱实体集的分辨符组合而成。除了创建主码之外,还要在关系A上建立外码约束,该约束指明属性b1,b2,...,bn参照关系B的主码。外码约束保证弱实体的每个元组都有一个表示相应强实体的元组与之对应。

联系集的表示

设R是联系集,a1,a2,...,an表示所有参与R的实体集的主码的并集构成的属性集合,设R的描述性属性为b1,b2,...,bm。用名为R的关系模式表示该联系集,下面集合中的每一项表示为模式的一个属性:

{a1,a2,...,an}∪{b1,b2,...,bm}

从所有相关实体集中取所有主码属性能够用来标识一个指定元组,但对于二元联系集,这会得到一个比我们所需要的主码大的属性集合。因此可以如下选择主码:

  1. 多对多:参与实体集的主码属性的并集成为主码。
  2. 一对一:任何一个实体集的主码都可以作为主码。
  3. 一对多或多对一:联系集中“多“的那一方的实体集的主码构成主码。
  4. 边上没有箭头的n元联系集:所有参与实体集的主码属性的并集成为主码。
  5. 边上有一个箭头的n元联系集:不在”箭头“侧的实体集的主码属性的并集成为模式的主码,一个联系集外只允许有一个箭头。

另外还要在关系模式R上建立外码约束:对于每个与联系集R相关的实体集Ei,我们建立一个关系模式R上的外码约束,R来自Ei主码属性的那些属性参照表示关系模式Ei的主码。

扩展的E-R特性

虽然基本的E-R概念已足以对大多数数据库特征建模,但数据库的某些方面可以通过对基本E-R模型作某些扩展来更恰当的描述,例如特化、概化、高层和底层实体集、属性继承和聚集。

特化

在实体集内部进行分组的过程成为特化(specialization)。例如实体集person可以进一步归类为employee和student,这两个类中的每一个都用一个属性集来描述,包括实体集person的所有属性加上可能的附加属性。person的特化使得我们可以根据他们是雇员还是学生来区分人。

一个实体集可以根据多个可区分的特征进行特化。例如还可以基于一个学生是大学生还是高中生进行特化。当一个实体集上形成多于一种特化时,某个特定实体可能同时属于多个特化实体集。

在E-R图中,特化用从特化实体指向另一方实体的空心箭头来表示。我们称这种关系为ISA关系,即”is a“,表示是一个。

特化和概化

一个实体集如果可能属于多个特化实体集,这种特化称为重叠特化(overlapping specialization);如果一个实体集属于至多一个特化实体集,这种特化称为不相交特化(disjoing specialization)。对于一个重叠特化,分开使用两个箭头,例如上图中的employee和student;对于一个不相交特化,使用一个箭头,例如上图中的high-school和college。

概化

从初始实体集到一系列不同层次的实体子集的细化代表了一个自顶向下的设计过程,在这个设计过程中,显式的产生出差别,即特化。设计过程也可以自底向上进行,多个实体集根据共同具有的特征综合成一个较高层的实体集,即概化。

概化是高层实体集与一个或多个低层实体集间的包含关系。在上图中可以由person实体集创建出employee和student两个特化,也可以由employee和student概化出高层实体person。

高层与低层实体集也可以分别称作超类和子类。上图中person是employee和student的超类,student又是high-school和college的超类。

对于所有的实际应用来说,概化只不过是特化的逆过程。在E-R图中这两个过程的表示不做区分。这两种方式的区别主要在于它们的出发点和总体目标。

特化从单一的实体集出发,通过创建不同的低层实体集来强调同一实体集中不同实体间的差异。低层实体集可以有不适用于高层实体集中所有实体的属性,也可以参与到不使用高层实体集中所有实体的联系中。如果employee和student与person实体拥有完全相同的属性,并且与person实体参与完全相同的联系,则没有必要特化person实体集。

概化的进行基于这样的认识:一定数量的实体集共享一些共同的特征(即用相同的属性描述它们,且它们都参与到相同的联系集中)。概化是在这些实体集的共性的基础上将它们综合称一个高层实体集。概化用于强调低层实体集间的相似性并隐藏它们的差异。

属性继承

由特化和概化所产生的高层和低层实体的一个重要特性是属性继承(attribute inheritance)。高层实体集的属性被低层实体集继承。例如employee和student继承了person的属性,因此它们都使用person的属性以及他们特有的属性来描述。属性继承适用于所有低层实体集,因此student的子类也继承了person的属性。

低层实体集同时还继承的参与其高层实体参与的联系集。类似的,参与继承适用于所有低层实体集。

对E-R图的一个给定的部分来说,不管它是通过特化还是通过概化得到的,其结果都是一样的:

  1. 高层实体集所关联的所有属性和联系适用于它的所有低层实体集;
  2. 低层实体集特有的性质仅适用于特定的低层实体集。

上图为实体集的层次结构。在层次结构中,给定的实体集作为低层实体集只参与到一个ISA联系中,即在这个图中实体集只具有单继承。如果一个实体集作为低层实体集参与到多个ISA联系中,则称这个实体具有多继承,且产生的结构被称为格。

聚集

E-R模型的一个局限性在于它不能表达联系间的联系。处理这种情况的方法是使用聚集。聚集(aggregation)是一种抽象,通过这种抽象,联系被视为高层实体。可以将联系集看成一个高层实体集,这种实体集可以像任何其他实体集一样来处理。这样就可以在该联系集与另一个实体集之间创建一个二元联系集。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值