数据库设计和E-R模型
数据库设计和E-R模型
设计过程概览
- 设计数据库模式
- 设计访问和更新数据的程序
- 设计控制数据访问的安全模式
实体 联系模型 E-R model
三个基本概念
- 实体集
- 联系集
- 属性
实体集
每个实体有一组性质,其中的一些可以唯一标识一个实体。比如身份证号
值
联系集
eg:
二元联系集:涉及两个实体集的联系集。
属性
实体集的属性是 将实体集映射到域的函数。每个实体可以用一组(属性,数据值)的key对来表示。
属性划分
- 简单 复合(composite)属性:简单指的是 该部分不能划分为更小的部分;复合则相反(举例:名字的属性可以化为姓和名) 复合属性可以有层次
- 单值-多值 属性。 单值:每个人有一个独特的身份证号;多值:从小到大的外号,
- 派生(derived) 属性: 数据集里有人的出生年月日,可以推断出他的年龄,那 age 属性就是 派生属性;dateofbirth为 基属性
**
约束
映射基数 mapping cardinality
一个实体通过联系集能关联到的实体个数
对于实体集 A和B 二元联系集来说,映射基数必然是以下情况
参与约束
如果实体集的每个实体都参与到联系集R的至少一个联系中,则E的参与为 全部(Total)的, **反之则为部分的**(partial). 比如 a中B就是全部的,a是部分的,b的两个实体集都是全部的。
码
区分实体集中的实体的方法。
一个实体集中不允许两个实体对于所有属性都有一样的值
关系模式的码概念适用于实体集 和 唯一标识联系,将联系互相区分。
联系的码
从实体集中删除冗余属性
一旦选择好实体和相应属性,实体间的联系集就建立起来了,这些联系有可能会导致不同实体集中的属性冗余,需要将其从原始实体集中删除。
暂时理解:因为有联系,且部门名称是部门集的主码,数据库可以直接以联系来获值,而不需要额外建立一个属性。
**
实体-联系图
E-R diagram
基本结构
映射基数
就是上面的二元映射基数概念的图像表示
l..h形式 关联的最大和最小的映射基数
l为最小的映射基数,最小值为1表示这个实体集在联系集中全部参与
h为最大的映射基数,最大值为1为这个实体集(每一个元组)参与至多一个联系,为*则表示没有限制
1..1代表一个学生只能且必须有一个导师,0…*代表一个导师可以有0-多个学生。
如果两边最大值都为1,则是1对1
复杂属性
first/middle/last为name的子属性,而name为复合属性(同address)
{phone_number}为多值属性
age() 表示派生属性
**
角色
非二元的联系集
只允许在一个联系集外有一个箭头,如果有两个箭头指向A/B,可能有两种解释:第一个是A和BC是一对X,联系的主键是{B,C}的候选码; 第二个是A和B/C中的一个1对x。此时联系R的主键是A∪B/C
因为有两种解释,所以规定在ER模型中,一个联系集外只有一个箭头
**
弱(强)实体集 weak(strong) entity set
没有足够属性以形成主码的实体集,有主码的实体集称为强实体集。
举例:
弱实体集通过和强实体集建立 联系,联系给弱实体集提供额外信息(唯一标识)作为新主码。
主要目的:以联系为方法来 消除冗余
和弱实体层关联的集称作 *标识(identifying) *或 *属主实体集(owner entity set) *才有意义
即 弱实体集存在依赖(existence dependent)
标识实体 own 它所标识的弱实体集。
分辨符(discriminator): 无主码时区分依赖特定强实体集的弱实体集中实体的方法——属性集合
**
转换为关系模式
简单属性直接转;
复杂属性中, 复合属性拆开写(name: first+last); 派生属性在后文讨论; 多值属性把每个值都作为主码
弱实体集的标识
分开标识广义的主码,并进行外码约束。
实体联系设计问题
给教师信息构建数据库,”电话”作为属性还是实体集
具体问题具体分析…
二元还是n元联系
通常都是二元的,但非2元的也可以用2元来表示(每两个实体集建立一个联系)
但是这样会增加很多联系集标识属性,增加设计难度和储存要求
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)特化:实体集至多属于一个特化实体集
E-R图中,表示方法为 从特化实体指向另一方实体的空心箭头标识( is-a 关系)
重叠特化:分开使用两个箭头;不相交特化:使用一个箭头
概化 generalization
特化的逆过程; 自底而上,将实体集的共性基础上(强调相似并隐藏差异——改属性),综合为一个高层实体集(超集)
属性继承 attribute inheritance
高层实体集的属性被低层实体集继承 (student继承了person的属性: ID name address etc.)—单继承
同时低层实体集可能继承*高层实体参与的联系集 *
(person+department, student的ID和per_dept分别从两个地方继承) —— 多(mutiple)继承
概化上的约束
聚集 aggregation
E-R模型的局限性在于无法表达 联系之间的联系
**
聚集:通过抽象过程,将联系视为高层实体
eg:
新建立了一个联系:项目评估——学校会抽查评估项目
proj_guige和eval_for实际上不能合并(虽然有类似的主码),因为可能有些项目未被评估
但是proj_guide和eval_for在关联实体集上有高度重合的部分!
故可以将含信息量多的 聚集 起来作为高层实体供eval_for来继承
转化为关系模式
但是会出现无法定义的外码约束,所以还是需要创一个person关系
如果是重叠概化,很多值会被不必要的储存多次!
只要不是全部概化特化,就会出现冗余储存….
E-R图表示法总结
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!