E-R模型
设计过程
设计数据库模式、设计访问更新数据库的程序、以及设计控制数据访问的安全模式
- 概念设计阶段:构建实体-联系图
- 逻辑设计阶段:将实体-联系图映射到关系模式
- 物理设计阶段:指明数据库文件组织格式和索引结构
实体-联系模型
实体-联系(Entity-Relationship)模型:E-R 模型是一种语义模型,将现实世界事物的含义和相互关联映射到概念模式
基本概念:
- 实体集
- 联系集
- 属性
一个数据库可以被建模为:
- 实体的集合
- 实体间的联系
实体集
- 实体是现实世界可区别于所有其他对象的一个“事物”或“对象”
- 实体有属性,它是实体集中每个成员所拥有的描述性性质
- 每个实体的每个属性都有一个值
- 实体集是相同类型,即具有相同性质(或属性)的一个实体集合
- 实体集的外延是指属于实体集的实体的实际集合
联系集
- 联系是指多个实体间的相互关联
- 联系集是相同类型联系的集合
- 联系集也可以有属性(用于描述联系,比如创建时间)
角色
- 实体在联系中扮演的功能称为实体的角色
- 角色是隐含的,通常不指定
- 当同样的实体集参与一个联系集多于一次,这类联系集称作是递归联系集
- 此时需用角色指明实体是如何参与联系实例的
度
参与联系集的实体集的数目称为联系集的度
常见的多为二元联系集:
- 涉及两个实体集(度为 2)
- 数据库系统中大多数联系集都是二元的,涉及两个实体集以上的联系较少
属性
- 实体通过一组属性来表示,属性是实体集中每个成员所拥有的描述性性质
- 域:每个属性可取值的集合,也称值域
- 实体集的属性是将实体集映射到域的函数
属性类型
- 简单和复合属性
- 单值和多值属性
- 派生属性和基属性
- 派生属性可以从别的属性派生出来
- 派生属性值不存储,而是在需要时计算出来
复合属性
复合属性可以是有层次的
![[images/Pasted image 20251201183925.png]]
约束
映射基数约束
映射基数(基数比率):表示一个实体通过一个联系集能关联的实体类的个数
对于二元联系集,映射基数必然是以下之一:
- 一对一
- 一对多
- 多对一
- 多对多
![[images/Pasted image 20251201181344.png]]
![[images/Pasted image 20251228150055.png]]
其中有些元素可能不能映射到另一集合
参与约束
- 如果实体集 E 中的每个实体都参与到联系集 R 的至少一个联系中,实体集 E 在联系集 R 中的参与称为全部(total)的
- 如果实体集 E 中只有部分实体参与到 R 的联系中,实体集 E 在联系集 R 中的参与称为部分(partial)的
码
实体集的码
- 超码:一个或多个可以用来唯一地标识实体的属性(集)
- 候选码:最小的超码
- 主码:被选择用来区分实体的候选码
- 主码只有一个,但候选码可以有多个
联系集的码
- 如果联系集 R 没有属性,则以下属性集合描述集合 R 中的一个联系(即各个实体集的主码元组):
$$
\text{primary-key(E1)}\cup\text{primary-key(E2)}\cup\dots\cup\text{primary-key(En)}
$$
如果联系集 R 有属性 $a_1,a_2\dots a_n$,则以下属性集合描述集合 R 中的一个联系(在上面的基础上添加上属性):
$$
\text{primary-key(E1)}\cup\text{primary-key(E2)}\cup\dots\cup\text{primary-key(En)}\cup{a_1,a_2,\dots, a_m}
$$
相关的实体集的主码集合形成了联系集的超码,在以上的两种情况下,联系集的一个超码总是有以下属性集合构成:
$$
\text{primary-key(E1)}\cup\text{primary-key(E2)}\cup\dots\cup\text{primary-key(En)}
$$
一对实体集在一个特定的联系集中只能有一个联系
冗余属性
假设有实体集:
- instructor 实体集,包含了 dept_name 属性
- department 实体集
联系集:inst_dept,联系 instructor 和 department
instructor 中的 dept_name 属性是冗余的,因为有一个明确的关系集 inst_dept 来联系 instructor 和 department;dept_name 属性重复了 inst_dept 联系中的信息,应该从 instructor 中除去
实体-联系图
基本图形
![[images/Pasted image 20251201193132.png]]
- 矩形代表实体集
- 属性在实体矩阵中列出
- 构成主码的属性以下划线标明
- 菱形代表联系集
参与表示
- 全部参与:实体集中每个实体都参与到联系集的至少一个联系中,使用两条线标识
![[images/Pasted image 20251228150750.png]]
- 部分参与:某些实体不参与到联系集中的任何一个联系
具有属性的联系集表示
在原图基础上添加
![[images/Pasted image 20251228150854.png]]
基数约束表示
在联系集和实体集之间使用:
- 箭头:表示一
- 线段:表示多
![[images/Pasted image 20251228150957.png]]
一对一
使用两个箭头
![[images/Pasted image 20251228151013.png]]
一对多
一侧使用箭头,一侧使用线段
![[images/Pasted image 20251228151032.png]]
多对多
两侧均使用线段
![[images/Pasted image 20251228151106.png]]
参与约束表示
![[images/Pasted image 20251228151137.png]]
复合、多值、派生属性表示
![[images/Pasted image 20251228151239.png]]
角色表示
- 一个联系的实体集不需要唯一
- 一个实体集中的元素每次出现都在关系中代表一个“角色”
![[images/Pasted image 20251228151247.png]]
三元关系表示
![[images/Pasted image 20251228151321.png]]
- 只允许在一个三元(或三元以上)联系集外有一个箭头来表示基数约束
- 如果有多于一个的箭头,那就会有两种解释,会混淆
- A 对于 B 和 C 各有至多一个实体关联
- (A,B)对于 C 和(A,C)对于 B 各有至多一个实体关联
弱实体集表示
- 一个没有足够的属性形成主码的实体集叫做弱实体集
- 弱实体集必须与标识或属主实体集(owner entity set)关联才有意义
- 弱实体集存在依赖于标识实体集
- 将弱实体集与其标识实体集相连的联系称为标识性联系
- 标识联系集以双边框的菱形表示
- 弱实体集通过一个全部参与的、多对一或一对一的联系集与标识实体集联系
- 弱实体集的分辨符是区分弱实体集中实体的属性集合,也称为该弱实体集的部分码
- 弱实体集的主码由标识实体集的主码和该弱实体集的分辨符共同组成
- 强实体集的主码并不存储于弱实体集
- 弱实体集可以参与标识性联系以外的其他联系,也可能与不止一个标识实体集关联
![[images/Pasted image 20251228153401.png]]
section 的主码:$(course_id, sec_id, semester, year)$
- 弱实体集的分辨符用虚下划线表示
- 标识联系集以双边框的菱形表示
在某些情况下,数据库设计者会选择将一个弱实体集表示为属主实体集的一个(多值)复合属性
- 如果弱实体集只参与标识性联系,而且其属性不多,建模时更适合将其作为属性
- 反之,更适合将其表示为弱实体集
关系模式转换
一个符合 E-R 模型的数据库可以表示为一些关系模式的集合
- 实体集和联系集都可以用表示数据库内容的统一的关系模式来表示
- 每个实体集和联系集都有一个特有的关系模式与其对应,并分配相应的名字
- 每个关系模式都有一些列(通常对应属性),每个列都有唯一的名字
实体集表示
简单属性表示
- 从强实体集转换而来的模式与强实体集具有相同属性、主码
- 从弱实体集转换的模式包含弱实体集的属性和标识强实体集的主码
- 该模式的主码由强实体集的主码与弱实体集的分辨符组合而成
- 并需要建立相应的外码约束和完整性约束(如级联删除)
复合属性表示
- 复合属性为每个子属性创建单独的属性
实体集 instructor 有复合属性
name:由first_name、middle_name和last_name构成转化关系模式后,该实体集具有
name_first_name、name_middle_name和name_last_name
多值属性表示
- 实体集 E 的多值属性 M 用一个独立的模式 EM 表示
- 模式 EM 包含对应于的 E 主码及多值属性 M 的属性
- 多值属性的每个值映射到关系模式 EM 的每一个独立元组
- 在关系模式 EM 上建立参照实体集 E 关系模式主码的外码约束
例子:instructor 的多值属性
phone_number在模式中表示为
$inst_phone= ( ID, phone_number)$
![[images/Pasted image 20251228155337.png]]
time_slot 实体除了主码外只有一个属性,同时该属性是多值属性
- 不需要建立一个对应于实体集的模式,只需创建一个对应于多值属性的关系即可
- sec_time_slot 中的
time_slot_id属性在这样处理后不能作为被参照的外码
联系集表示
- 主码选择
- 属性选择
- 需要为联系集的属性建立外码约束
合并模式冗余
多对一和一对多的联系集的模式:
- 如果“多”方参与是全部的,那么可以将“多”方实体集和联系集的模式合并成单个包含两个模式所有属性并集的关系模式(即将“一”合并入“多”)
- 合并后模式中加入原联系集的外码约束
- 如果“多”方参与是部分的,也可以通过使用空值来进行模式合并。转换为关系模式时,联系集中“一”方的相关属性应注意不能设为
not null(即“一”left join“多”)
在一对一联系的情况下,联系集的关系模式可以跟参与联系的任何一个实体集的模式进行合并
一般而言,连接弱实体集与其标识强实体集之间的标识性联系集转换出的模式是冗余的
实体-联系设计问题
常见错误
- 用一个实体集的主码作为另一个实体集的属性
- 将相关实体集的主码属性作为联系集的属性
实体集和联系集选择
当描述实体之间可能发生的行为时采用联系集
二元和多元联系集
所有非二元的联系集可以用多个二元联系集来表示,但有时 n 元的联系集能够更清楚的表示几个参与的实体集之间的联系
有些联系使用二元联系集比使用非二元联系集更好
三元联系集 parents ,联系孩子与其父母,最好表示为两个二元联系集, father 和 mother,使用二元联系集允许只有部分信息(例如,单亲家庭)
联系属性的布局
设计时将联系集的描述性属性作为联系集的属性还是实体集的属性这一选择,应由映射基数约束决定
- 一对多联系集的属性仅可以放到参与联系的“多”方实体集中
- 一对一联系集的属性可以放到任意一个参与联系的实体集中
- 在多对多联系集中,当一个属性是由参与的实体集联合确定而不是由单独的某个实体集确定时,该属性就必须放到多对多联系集中
扩展 E-R 特性
特化和概化
特化
自顶向下设计
特化(specialization):在实体集内部进行分组的过程,类似于继承
- 子集中的实体在某些方面区别于实体集中的其他实体
- 这些子集成为了较低层的实体集,可能具有高层实体集不具有的属性、或者参与到高层实体集不参与的联系集中
- 特化通过从特化实体指向另一个实体的空心箭头来表示
![[images/Pasted image 20251228162714.png]]
高层和低层实体集可以形成超类-子类
概化
自底向上设计
概化(generalization):高层实体集与一个或多个低层实体集间的包含关系
属性继承
属性继承:低层实体集继承了与其相关联的高层实体集的所有属性,并且继承地参与到其高层实体所参与的联系集中
设计约束
成员资格判定约束:
- 条件定义/属性定义的
- 用户定义的:用户将实体指派给某个实体集
实体是否可以属于同一概化中的多个低层实体集的约束:
- 不相交
- 一个实体至多属于一个低层实体集
- E-R 图中用多个低层实体集连接到同一个空心箭头标明
- 重叠
- 同一实体可同时属于同一概化的多个低层实体集
完全性约束:定义高层实体集中的一个实体是否必须属于该概化的至少一个低层实体集
- 全部(total): 每个高层实体必须属于一个低层实体集
- 部分(partial): 允许一些高层实体不属于任何低层实体集
聚集
![[images/Pasted image 20251228163006.png]]
为不引入冗余,用聚集来表示 E-R 模型
![[images/Pasted image 20251228163040.png]]
E-R 图总结
![[images/Pasted image 20251228163104.png]]
![[images/Pasted image 20251228163110.png]]
UML
UML(Unified Modeling Language): 统一建模语言