4.1 设计过程概览
真实世界 ⇒ \Rightarrow ⇒概念模型 ⇒ \Rightarrow ⇒逻辑模型 ⇒ \Rightarrow ⇒物理模型
数据库设计:
-
概念设计(Conceptual design):
用一个概念模型描述物理世界的一个主体
-
逻辑设计(Logical design):
把概念模型转换为逻辑模型(一个数据库模式)
-
物理设计(Physical design)
数据存储方式
在一个数据库模式的设计中,必须确保避免两个主要的缺陷:
冗余
:一种不好的设计可能会重复信息。例如,如果对于每次开课我们都存储课程标识和课程名称,那么对于每次开课,名称的存储就是冗余的不完整
:一种不好的设计可能会使得企业的某些方面难以甚至无法建模。例如,假设在上述情形中,我们只有对应于开课的实体,而没有对应于课程的实体。
4.2 实体-联系模型
实体-联系数据模型
(E-R数据模型)通过允许定义代表数据库全局逻辑结构的企业模式来做到的,采用了三个基本概念:实体集、联系集和属性,并有一种相关联的图形表示:E-R图。
一个数据库可被模式化为:实体集和实体间的关系
4.2.1 实体集
一个实体
(entity)是现实世界中可区别于所有其他对象的一个“事物”或“对象”。例如,大学中的每个人都是一个实体。每个实体有一组性质,并且某些性质集合的值必须唯一地标识一个实体。
实体集
(entity set)是共享相同性质或属性的、具有相同类型的实体的集合。例如,一所给定大学的所有教师的集合可定义为 i n s t r u c t o r instructor instructor实体集。
实体集的外延
(extension)指属于实体集的实体的实际集合。大学中教师的实际集合构成了 i n s t r u c t o r instructor instructor实体集的外延。
实体集不必互不相交
,例如可以定义大学中所有人员组成的person实体集。一个person可以是instructor实体,可以是student实体,可以既是instructor实体又是student实体,也可以都不是。
实体通过一组属性
来表示。属性是实体集中每个成员所拥有的描述性性质。
每个实体在它的每个属性上都有一个值
(value)。
实体集在E-R图中用一个矩形
来表示,该矩形分为两个部分,灰色阴影部分(DB书中)包含实体集的名称,第二部分包含实体集所有属性的名称。
4.2.2 联系集
联系
(relationship)是多个实体间的相互关联。我们可以定义关联Katz教师和Shankar学生的advisor联系。这一联系指明Katz是学生Shankar的导师。联系集
(relationship set)是相同类型联系的集合。
E-R模式中的一个联系实例
(relationship instance)表示在所建模的现实企业中被命名的实体之间的一种关联。联系集在E-R图中用菱形
表示,菱形通过线条连接到多个不同的实体集(矩形)。
联系集的形式化定义:
如果 E 1 , E 2 , ⋯ , E n E_1,E_2,\cdots,E_n E1,E2,⋯,En为实体集,那么联系集 R R R是
{ ( e 1 , e 2 , ⋯ , e n ) ∣ e 1 ∈ E 1 , e 2 ∈ E 2 , ⋯ , e n ∈ E n } \{(e_1,e_2,\cdots,e_n)|e_1\in E_1,e_2\in E_2,\cdots,e_n \in E_n\} {(e1,e2,⋯,en)∣e1∈E1,e2∈E2,⋯,en∈En}
的一个子集,其中 ( e 1 , e 2 , ⋯ , e n ) (e_1,e_2,\cdots,e_n) (e1,e2,⋯,en)是一个联系实例
联系集的属性在E-R图中通过未分割的矩形来表示。‘
递归的联系集
(recursive):同样的实体集以不同的角色多次参与一个联系集,在这类联系集中,有必要用显式的角色名来指明实体是如何参与联系实例的。
例如,考虑记录大学中所开设的所有课程的信息的 c o u r s e course course实体集,我们用 c o u r s e course course实体的有序对来建模联系集 p r e r e q prereq prereq,以描述一门课程(C2)是另一门课程(C1)的先修课,以(C1,C2)对来表示。则E-R图如图所示:
描述性属性
(descriptive attribute):联系也可以具有被称为描述性属性的属性。例如:考虑与 s t u d e n t student student和 s e c t i o n section section实体集相关联的 t a k e s takes takes联系集,希望存储联系的描述性属性 g r a d e grade grade,以记录学生在开设的课程中获得的成绩。
相同的实体集可能会参与到多个联系集中。
二元联系集
(binary relationship set):涉及两个实体集的联系集,例如 a d v i s o r advisor advisor和 t a k e s takes takes。有时联系集会涉及多于两个实体集。
实体集的度
(degree):参与联系集的实体集的数目
一个三元联系集的例子:
假设我们有一个代表大学内开展的所有研究项目的 p r o j e c t project project实体集,考虑 i n s t r u c t o r 、 s t u d e n t 、 p r o j e c t instructor、student、project instructor、student、project实体集。每个项目可以有多名参与的学生和多位参与的教师。另外,在项目中工作的每名学生必须有一位相关教师来指导该生在项目中的工作。目前我们忽略项目和教师之间以及项目和学生之间的两个联系,而关注在一个特定项目上由哪位教师指导哪名学生。
为了表示这些信息,我们通过 p r o j _ g u i d e proj\_guide proj_guide三元联系集将三个实体集联系到一起, p r o j _ g u i d e proj\_guide proj_guide的实例表示在一个特定项目上一名特定学生接受了一位特定教师指导。注意,一名学生在不同项目中可以由不同教师指导,不能将这个联系描述称学生与教师的二元关系。
4.3 复杂属性
属性的域
:每个属性有一个可取值的集合,称为该属性的域(domain),或者值集(value set)。
简单属性
(simple):不能被划分为子部分
复合属性
(composite):可以被划分为子部分(即其他属性),复合属性帮助我们把相关属性集合起来,使模型更清晰。复合属性的出现可以是有层次地(可嵌套的)
单值属性
(single-valued):对一个特定实体都只有单独的一个值
多值属性
(multivalued):一个属性可能对应于一组值。例如 i n s t r u c t o r instructor instructor实体集中有一个 p h o n e _ n u m b e r phone\_number phone_number属性,一个教师可以有0个、1个或多个电话号码,不同的教师可以有不同数量的号码
派生元素
(derived attribute):这类属性的值可以从其他相关属性或实体的值派生出来。例如,假设 i n s t r u c t o r instructor instructor实体集有一个 s t u d e n t _ a d v i s e d student\_advised student_advised属性,它表示一位教师指导了多少名学生。我们可以通过统计与一位教师相关联的所有 s t u d e n t student student实体的数目来导出这个属性的值。派生属性的值并不存储,而是在需要时被计算出来。
用E-R符号来表示复合属性:
注意{}表示多值属性,age()表示派生属性age,复合的不同层次以缩进表示
4.4 映射基数
映射基数
(mapping cadinality)或基数比率表示一个实体能通过一个联系集关联的另一些实体的数量。
对于实体集A和B的二元联系集R来说,映射基数必然是以下情况:一对一
、一对多
、多对一
、多对多
在E-R图中的画法,有箭头的一方是一,没箭头的是多:
一对一
:一名教师最多可以指导一名学生,一名学生最多可以有一位导师一对多
:一名教师可以指导多名学生,一名学生最多只能有一位导师多对一
:一位教师最多可以指导一名学生,一名学生可以有多为导师多对多
:一名教师可以指导多名老师,一名学生可以有多位导师
如果实体集E中的每个实体都必须参与到联系集R中的至少一个联系中,那么实体集E在联系集R中的参与就被称为是全部
的;如果E中一些实体可能不参与到R的联系中,就称为是部分
的。
在E-R图中,用双线表示一个实体在联系集中的全部参与:
这表明每个学生都必须要有导师。
基数约束
:E-R图还提供了一种方式来描述更复杂的约束:线段上可以有一个关联的最小和最大基数,用 l . . h l..h l..h的形式表示,其中 l l l表示最小基数, h h h表示最大基数。最小值为1表示实体集全部参与联系集,最大值为1表示实体至多参与一个联系,而最大值为 ∗ * ∗代表没有限制。
表明每名学生必须有且只有一位导师,导师可以有0名或任意多的学生,因此 a d v i s o r advisor advisor联系时从 i n s t r u c t o r instructor instructor到 s t u d e n t student student的一对多联系。
4.5 主码
一种区分给定实体集中的实体和给定联系集的联系的方式
4.5.1 实体集
一个实体的属性取值必须可以唯一标识该实体,那么在之前定义的关系模式的码(key)的概念直接适用于实体集。关系模式中的超码、候选码、主码的概念同样适用于实体集。
4.5.2 联系集
设 R R R是一个设计实体集 E 1 , E 2 , ⋯ , E n E_1,E_2,\cdots,E_n E1,E2,⋯,En的联系集。设 p r i m a r y _ k e y ( E i ) primary\_key(E_i) primary_key(Ei)代表构成实体集 E i E_i Ei的主码的属性集合。
联系集是联系实例的集合,并且每个实例都由参与其中的实体唯一标识,因此,属性集合
p r i m a r y _ k e y ( E 1 ) ∪ p r i m a r y _ k e y ( E 2 ) ∪ ⋯ ∪ p r i m a r y _ k e y ( E n ) primary\_key(E_1)\cup primary\_key(E_2)\cup\cdots\cup primary\_key(E_n) primary_key(E1)∪primary_key(E2)∪⋯∪primary_key(En)
构成了联系集的一个超码。
二元联系集主码的选择:
多对多
:联系集主码由双方主码的并集构成。一对多
和多对一
:"多"方的主码是最小的超码,并被用作主码。例如,如果每名学生最多只能有一位导师( s t u d e n t student student到 i n s t u c t o r instuctor instuctor的联系是多对一的),则 a d v i s o r advisor advisor的主码就仅是 s t u d e n t student student的主码。一对一
:任一参与实体集的主码都构成最小超码,任选一个作为联系集的主码
非二元联系集主码的选择:
如果不存在基数约束,那么前文所述的超码就是唯一的候选码即主码。
如果有基数约束,我们约定一个联系集最多有一个箭头指出,理由如下。
假设实体集 E 1 , E 2 , E 3 , E 4 E_1,E_2,E_3,E_4 E1,E2,E3,E4之间有联系集 R R R,并且只有指向实体集 E 3 E_3 E3和 E 4 E_4 E4的边 带箭头。那么有两种可能的解释:
- 来自 E 1 , E 2 E_1,E_2 E1,E2的一个特定实体组合可以和至多一个来自 E 3 , E 4 E_3,E_4 E3,E4的实体组合相关联。因此,联系 R R R的主码可以用 E 1 , E 2 E_1,E_2 E1,E2的主码的并集来构造
- 来自 E 1 、 E 2 、 E 3 E_1、E_2、E_3 E1、E2、E3的一个特定实体组合至多可与来自 E 4 E_4 E4的一个实体组合相关联,并且来自 E 1 、 E 2 、 E 4 E_1、E_2、E_4 E1、E2、E4的一个特定实体组合至多可与来自 E 3 E_3 E3的一个实体组合相关联,那么 E 1 , E 2 , E 3 E_1,E_2,E_3 E1,E2,E3的主码并集构成一个候选码, E 1 , E 2 E_1,E_2 E1,E2和 E 4 E_4 E4的主码的并集也是如此
因此,为了避免混淆,只允许非二元联系集有一个箭头指出,在这种情况下,两种解释是等价的。
综上,非二元联系集 R R R的主码是那些没有被来自联系集 R R R的箭头指向的、参与实体集 E i E_i Ei的主码的并集。
4.5.3 弱实体集
弱实体集
(weak entity set)的存在依赖于另一个实体集,称为其标识性实体集
(identifying entity set);使用标识性实体集的主码以及称为分辨符属性
(discriminator attribute)的额外属性来唯一地标识弱实体,而不是将主码于弱实体相关联。非弱实体集的实体集被称为强实体集
(strong entity set)
例如:考虑一个 s e c t i o n section section实体,由课程编号、学期、学年以及课程段标识来唯一标识。课程段实体与课程实体相关联。假定我们在 s e c t i o n section section和 c o u r s e course course实体集之间创建一个 s e c _ c o u r s e sec\_course sec_course联系集。
那么 s e c _ c o u r s e sec\_course sec_course中的信息是冗余的,由于 s e c t i o n section section已有 c o u r s e _ i d course\_id course_id属性,它表示该课程段所关联的课程。消除这种冗余的一种方式是去掉 s e c _ c o u r s e sec\_course sec_course联系;然而这么做使得两个实体集之间的联系隐含于一个属性中,这并不是我们想要的。
另一种方法是 s e c t i o n section section实体中不保存 c o u r s e _ i d course\_id course_id属性,而只保存剩下的 s e c _ i d 、 y e a r sec\_id、year sec_id、year以及 s e m s t e r semster semster,单这样 s e t i o n setion setion实体集就没有足够的属性来唯一标识一个特定的 s e c t i o n section section实体;尽管每个 s e c i o n secion secion实体都是可区分的,不同课程的课程段也可能共享相同的 s e c _ i d 、 y e a r sec\_id、year sec_id、year以及 s e m e s t e r semester semester。位解决这个问题,我们将 s e c _ c o u r s e sec\_course sec_course联系视为一种特殊的联系,它为唯一标识 s e c t i o n section section实体提供所需的额外信息,在此情况下是 c o u r s e _ i d course\_id course_id
在这个例子中, s e c t i o n section section的主码由标识性实体集(即 c o u r s e course course)的主码加上弱实体集(即 s e c t i o n section section)的分辨符构成,因此,主码就是 { c o u r s e _ i d , s e c _ i d , y e a r , s e m e s t e r } \{course\_id,sec\_id,year,semester\} {course_id,sec_id,year,semester}
每个弱实体必须和一个标识性实体相关联;也就是说,弱实体集被称为存在依赖
(existence dependent)于标识性实体集。标识性实体集被称为拥有它所标识的弱实体集。将弱实体集与标识性实体集相关联的联系被称为标识性联系
(identifying ralationship)。
在E-R图中,通过双边框的矩形描述弱实体集,其分辨符被加上虚的下划线。关联弱实体集和标识性强实体集的联系集以及双边框的菱形表示。
4.6 从实体集中删除冗余属性
一个属性在两个实体集 A , B A,B A,B中均存在,并在 A A A中是主码,那么它在 B B B中是冗余的,需要删除。
一个例子
联系集:
- i n s t _ d e p t inst\_dept inst_dept:关联教师和系
- s t u d _ d e p t stud\_dept stud_dept:关联学生和系
- t e a c h e s teaches teaches:关联教师和课程段
- t a k e s takes takes:关联学生和课程段,具有描述属性 g r a d e grade grade
- c o u r s e _ d e p t course\_dept course_dept:关联教师和课程段
- s e c _ c o u r s e sec\_course sec_course:关联课程段和课程
- s e c _ c l a s s sec\_class sec_class:关联课程段和时段
- a d v i s o r advisor advisor:关联学生和教师
- p r e r e q prereq prereq:关联课程和先修课程
4.7 将E-R图转换为关系模型
在数据库设计中,对于每个实体集以及每个联系集,都有唯一的关系模式与之对应。
4.7.1 强实体集的表示
设 E E E是只具有简单描述性属性 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an的强实体集。我们用具有 n n n个不同属性的、称作 E E E的模式来表示这个实体集,写为
E = ( a 1 , a 2 , ⋯ , a n ) E=(a_1,a_2,\cdots ,a_n) E=(a1,a2,⋯,an)
4.7.2 具有复杂属性的强实体集的表示
对于复合属性
,将其拆分为它含有的模式,例如 i n s t r u c t o r instructor instructor的 n a m e name name是复合属性,包括 f i r s t _ n a m e 、 m i d d l e _ i n i t i a l first\_name、middle\_initial first_name、middle_initial和 l a s t _ n a m e last\_name last_name, s t r e e t street street也是复合属性,那么应该写为:
KaTeX parse error: Expected 'EOF', got '&' at position 12: instructor&̲(ID,first\_name…
对于多值属性
M M M,我们构建关系模式 R R R,该模式具有一个对应于 M M M的属性 A A A,以及对应于 M M M所在的实体集或联系集的主码属性。
考虑 i n s t r u c t o r instructor instructor中含有 p h o n e _ n u m b e r phone\_number phone_number多值属性, i n s r u c t o r insructor insructor的主码是 I D ID ID,那么对于这个多值属性,我门构造一个关系模式:
i n s t r u c t o r _ p h o n e ( I D ‾ , p h o m e _ n u m b e r ‾ ) instructor\_phone(\underline{ID},\underline{phome\_number}) instructor_phone(ID,phome_number)
教师的每个电话都表示为该模式上的关系中的一个唯一元组。
在一个实体集只有两个属性:单个主码属性 B B B以及单个多值属性 M M M,我们可以删掉多值属性的关系模式。
4.7.3 弱实体集的表示
设 A A A是具有属性 a 1 , a 2 , ⋯ , a m a_1,a_2,\cdots,a_m a1,a2,⋯,am的弱实体集, B B B是 A A A所依赖的强实体集, B B B的主码由属性 b 1 , b 2 , ⋯ , b n b_1,b_2,\cdots,b_n b1,b2,⋯,bn构成。我们用名为 A A A的关系模式表示实体集 A A A,该模式的每个属性对应于以下集合中的一个成员:
{ a 1 , a 2 , ⋯ , a m } ∪ { b 1 , b 2 , ⋯ , b n } \{a_1,a_2,\cdots,a_m\}\cup\{b_1,b_2,\cdots,b_n\} {a1,a2,⋯,am}∪{b1,b2,⋯,bn}
作为示例, s e c t i o n section section为弱实体集,该实体集有属性: s e c _ i d 、 s e m e s t e r 、 y e a r sec\_id、semester、year sec_id、semester、year,所依赖的 c o u r s e course course实体集的主码是 c o u r s e _ i d course\_id course_id。则可写为:
s e c t i o n ( c o u r s e _ i d ‾ , s e c _ i d ‾ , s e m e s t e r ‾ , y e a r ‾ ) section(\underline{course\_id},\underline{sec\_id},\underline{semester},\underline{year}) section(course_id,sec_id,semester,year)
加上依赖主码就行了
4.7.4 联系集的表示
联系集的主码加上属性即可。
4.8 扩展的E-R特性
特化、概化、高层和低层实体集、属性继承和聚集
4.8.1 特化
实体集中可能包含一些实体的子集,这些实体在某些方面区别于实体集中的其他实体。例如,实体集中某个实体子集可能具有不被该实体集中所有实体所共享的一些属性。
例如, p e r s o n person person实体集可进一步分为以下两类:
- e m p l o y e e employee employee
- s t u d e n t student student
这两类人中的每一类都通过一个属性集来描述,它包括 p e r s o n person person实体集的所有属性加上可能的附加属性。例如 e m p l o y e e employee employee实体可进一步用 s a l a r y salary salary属性来描述,而 s t u d e n t student student实体可进一步用 t o t _ c r e d tot\_cred tot_cred属性来描述。在实体集内部进行分组的过程称为特化
。
重叠特化
:一个实体可以属于多个特化实体集,使用多个单独的箭头
不相交特化
:一个实体至多可以属于一个特化实体集,使用单个箭头
特化联系还可能被称作超类-子类
联系。
4.8.2 概化
从初始实体集到一些列不同层次的实体子集的细化代表了一种自顶向下的设计过程,在这个过程中显式地产生出差别。设计过程也可以通过自底向上地方式进行,其中多个实体集根据共同具有的特征综合成一个更高层的实体集。(其实是一个概念?设计的顺序不同而已)
4.8.3 属性继承
属性继承
:高层实体集的属性被低层实体集继承
。例如 s t u d e n t 、 e m p l o y e e student、employee student、employee继承了 p e r s o n person person的属性。(实体集)
此外,低层实体集(或子类)同时还继承地参与其高层实体(或超类)所参与地联系集。例如。假如 p e r s o n person person实体集参与到与 d e p a r t m e n t department department的 p e r s o n _ d e p t person\_dept person_dept联系集。那么 p e r s o n person person的子类 s t u d e n t 、 e m p l o y e e 、 i n s t r u c t o r student、employee、instructor student、employee、instructor和 s e c r e t a r y secretary secretary实体集也都隐式地参与到与 d e p a r t m e n t department department的 p e r s o n _ d e p t person\_dept person_dept联系中。
图13描述了实体集的一种层次结构
。在层次结构中,一个给定实体集作为低层实体集只参与到一个ISA联系中,即在这样的图中实体集只具有单继承
。如果一个实体集作为低层实体集参与到多个ISA联系中,则称这个实体集具有多继承
,且产生的结构被称为格
。
4.8.4 特化上的约束
对特化/概化的一种约束规定了特化是重叠还是不相交的,另一种类型的约束时完全性约束
,它规定高层实体集中的一个实体是否必须至少属于该特化/概化内的一个低层实体集。
- 全部特化或概化。每个高层实体必须属于一个低层实体集
- 部分特化或概化。一些高层实体可以不属于任何底层实体集合
部分特化是默认的,可以在E-R图中指定全部特化:通过在图中加入关键字“total”
,并画一条从关键字到应用该关键字的相应空心箭头(对于全部特化)的虚线,或者画从关键字到应用该关键字的一组空心箭头(对于重叠特化)的虚线。
4.8.5 聚集
考虑之前的三元联系 p r o j _ g u i d e proj\_guide proj_guide,是 i n s t r u c t o r 、 s t u d e n t instructor、student instructor、student和 p r o j e c t project project之间的联系集,现在假设在项目上指导学生的每位教师需要提交月度评估报告。我们将评估报告建模为具有 e v a l u a t i o n _ i d evaluation\_id evaluation_id主码的 e v a l u a t i o n evaluation evaluation实体。
记录一个 e v a l u a t i o n evaluation evaluation所对应的 ( s t u d e n t , p r o j e c t , i n s t r u c t o r ) (student,project,instructor) (student,project,instructor)组合的另一种方式是在这四个实体集之间建立一个四元联系集 e v a l _ f o r eval\_for eval_for。(四元联系是必需的,例如, s t u d e n t student student和 e v a l u a t i o n evaluation evaluation之间二元联系无法让我们表示一个 e v a l u a t i o n evaluation evaluation所对应的 ( p r o j e c t , i n s t r u c t o r ) (project,instructor) (project,instructor)组合)
对于这样一个四元联系集,可以得到如下E-R图:
p r o j _ g u i d e proj\_guide proj_guide和 e v a l _ f o r eval\_for eval_for不能合并,因为某些 i n s t u c t o r , p r o j e c t , s t u d e n t instuctor,project,student instuctor,project,student的组合可能没有相关联的 e v a l u a t i o n evaluation evaluation。
显然这个E-R图是存在E-R图,因为 e v a l _ f o r eval\_for eval_for的每一个三元组合都必须在 p r o j _ g u i d e proj\_guide proj_guide中,如果 e v a l u a t i o n evaluation evaluation是一个值而不是一个实体,那么我们可以将 e v a l u a t i o n evaluation evaluation作为 p r o j _ g u i d e proj\_guide proj_guide联系集的一个多值复合属性。但是 e v a l u a t i o n evaluation evaluation也可能和其他实体相关联,就不可以这样了,例如,每份评估报告可能和一个 s e c r e t a r y secretary secretary相关联,负责评估报告的后续处理以支付奖学金。
那么可以用聚集
优化,通过这种抽象,联系被视为高层实体,这样,我们可以将 p r o j _ g u i d e proj\_guide proj_guide联系集看成一个名为 p r o j _ g u i d e proj\_guide proj_guide的高层实体集,然后我们就可以在 p r o j _ g u i d e proj\_guide proj_guide和 e v a l u a t i o n evaluation evaluation之间创建一个二元联系 e v a l _ f o r eval\_for eval_for来表示一个 e v a l u a t i o n evaluation evaluation对应于哪个 ( s t u d e n t , p r o j e c t , i n s t r u c t o r ) (student,project,instructor) (student,project,instructor)组合。
4.9 实体-联系设计问题
p200 可以看一下