数据库设计和E-R模型

数据库设计和E-R模型

设计过程概览

  • 设计数据库模式
  • 设计访问和更新数据的程序
  • 设计控制数据访问的安全模式

实体 联系模型 E-R model

三个基本概念

  • 实体集
  • 联系集
  • 属性

实体集

image.png
每个实体有一组性质,其中的一些可以唯一标识一个实体。比如身份证号
image.png
image.png

联系集

image.png
image.png
eg:image.png
image.png
image.png
image.png

二元联系集:涉及两个实体集的联系集。
image.png

属性

实体集的属性是 将实体集映射到域的函数。每个实体可以用一组(属性,数据值)的key对来表示。
image.png

属性划分

  • 简单 复合(composite)属性:简单指的是 该部分不能划分为更小的部分;复合则相反(举例:名字的属性可以化为姓和名) 复合属性可以有层次
  • 单值-多值 属性。 单值:每个人有一个独特的身份证号;多值:从小到大的外号,
  • 派生(derived) 属性: 数据集里有人的出生年月日,可以推断出他的年龄,那 age 属性就是 派生属性;dateofbirth为 基属性

**

约束

映射基数 mapping cardinality

一个实体通过联系集能关联到的实体个数

对于实体集 A和B 二元联系集来说,映射基数必然是以下情况
image.png

image.png

参与约束

如果实体集的每个实体都参与到联系集R的至少一个联系中,则E的参与为 全部(Total)的, **反之则为部分的**(partial). 比如 a中B就是全部的,a是部分的,b的两个实体集都是全部的。

区分实体集中的实体的方法。

一个实体集中不允许两个实体对于所有属性都有一样的值

关系模式的码概念适用于实体集 和 唯一标识联系,将联系互相区分。

联系的码

image.png

从实体集中删除冗余属性

一旦选择好实体和相应属性,实体间的联系集就建立起来了,这些联系有可能会导致不同实体集中的属性冗余,需要将其从原始实体集中删除。

image.png
暂时理解:因为有联系,且部门名称是部门集的主码,数据库可以直接以联系来获值,而不需要额外建立一个属性。
**

实体-联系图

E-R diagram

基本结构

image.png
image.png

映射基数

就是上面的二元映射基数概念的图像表示
image.png

l..h形式 关联的最大和最小的映射基数
l为最小的映射基数,最小值为1表示这个实体集在联系集中全部参与
h为最大的映射基数,最大值为1为这个实体集(每一个元组)参与至多一个联系,为*则表示没有限制

image.png

1..1代表一个学生只能且必须有一个导师,0…*代表一个导师可以有0-多个学生。

如果两边最大值都为1,则是1对1

复杂属性

image.png
first/middle/last为name的子属性,而name为复合属性(同address)
{phone_number}为多值属性
age() 表示派生属性
**

角色

image.png

非二元的联系集

只允许在一个联系集外有一个箭头,如果有两个箭头指向A/B,可能有两种解释:第一个是A和BC是一对X,联系的主键是{B,C}的候选码; 第二个是A和B/C中的一个1对x。此时联系R的主键是A∪B/C

因为有两种解释,所以规定在ER模型中,一个联系集外只有一个箭头
**

弱(强)实体集 weak(strong) entity set

没有足够属性以形成主码的实体集,有主码的实体集称为强实体集。
举例:
image.png
image.png

弱实体集通过和强实体集建立 联系,联系给弱实体集提供额外信息(唯一标识)作为新主码。
主要目的:以联系为方法来 消除冗余

和弱实体层关联的集称作 *标识(identifying) *或 *属主实体集(owner entity set) *才有意义
即 弱实体集存在依赖(existence dependent)
标识实体 own 它所标识的弱实体集。

分辨符(discriminator): 无主码时区分依赖特定强实体集的弱实体集中实体的方法——属性集合

image.png
**

转换为关系模式

简单属性直接转;
复杂属性中, 复合属性拆开写(name: first+last); 派生属性在后文讨论; 多值属性把每个值都作为主码
image.png

弱实体集的标识

image.png
分开标识广义的主码,并进行外码约束。

实体联系设计问题

给教师信息构建数据库,”电话”作为属性还是实体集

image.png
image.png
具体问题具体分析…

二元还是n元联系

通常都是二元的,但非2元的也可以用2元来表示(每两个实体集建立一个联系)
image.png
但是这样会增加很多联系集标识属性,增加设计难度和储存要求

EER 扩展E-R模型

特化

实体集中可能包含一些子集,其实体某些方面区别于实体集中的其他实体(不具备一般实体共享的属性)
eg: person实体集:employee & student
都有一般人的属性表示,但employees可以用 salary来标识;而students可以用 tot_cre标识( 特化过程 )

实体集内部分组的过程称为 特化 (specialization)
employee和student是person的两个特化。

重叠(overlapping)特化: 一个实体集可以属于多个特化实体集
eg: employee可以特化为instructor、secretary,也可以特化为temporary_employee、permanent_employee,这样一个employee可能是一个instructor的同时也是一个permanent_employee

不相交(disjoint)特化:实体集至多属于一个特化实体集

image.png

E-R图中,表示方法为 从特化实体指向另一方实体的空心箭头标识( is-a 关系)
重叠特化:分开使用两个箭头;不相交特化:使用一个箭头

概化 generalization

特化的逆过程自底而上,将实体集的共性基础上(强调相似并隐藏差异——改属性),综合为一个高层实体集(超集)

属性继承 attribute inheritance

高层实体集的属性被低层实体集继承 (student继承了person的属性: ID name address etc.)—单继承
同时低层实体集可能继承*高层实体参与的联系集 *
(person+department, student的ID和per_dept分别从两个地方继承) —— 多(mutiple)继承

概化上的约束

聚集 aggregation

E-R模型的局限性在于无法表达 联系之间的联系
**
聚集:通过抽象过程,将联系视为高层实体
eg:image.png
新建立了一个联系:项目评估——学校会抽查评估项目
proj_guige和eval_for实际上不能合并(虽然有类似的主码),因为可能有些项目未被评估
但是proj_guide和eval_for在关联实体集上有高度重合的部分!
故可以将含信息量多的 聚集 起来作为高层实体供eval_for来继承

转化为关系模式

image.png
image.png

但是会出现无法定义的外码约束,所以还是需要创一个person关系

如果是重叠概化,很多值会被不必要的储存多次!

image.png

只要不是全部概化特化,就会出现冗余储存….

E-R图表示法总结

image.png