E-R模型
1. 数据库设计
数据库设计流程
- 需求分析:与业务人员沟通,了解业务流程和数据需求
- 概念设计:将需求转化为高层次的实体-关系模型
- 逻辑设计:将实体-联系模型转换为关系模式,并规范化关系模式
- 物理设计:选择数据库管理系统,定义存储结构,优化查询性能
- 实现与部署
- 测试与优化
- 维护与迭代
数据库设计目标:数据完整、冗余少、性能好、安全性高、可维护性高、可扩展性高
2. 实体-联系模型
2.1 实体(Entity)
实体:现实世界中可区别于所有其他对象的一个“事物”或“对象”
实体集:共享相同性质或属性的、具有相同类型的实体的集合
E-R图表示实体集:一个矩形,头部是实体集的名称,剩下是实体集所有属性的名称,其中作为主码的属性被加了下划线
2.2 联系(Relationship)
联系:实体之间的关联
联系集:是相同类型联系的集合
E-R图表示联系集:一个菱形,通过线条连接到多个不同的实体集
2.3 概念
术语
- 参与:实体集参与联系集R表示实体集之间存在联系R
- 度:参与联系集的实体集数目
- 角色表示:实体在联系中扮演的功能,在E-R图中的线条上方标识
- 描述性属性:用于解释/描述联系的特定属性,提供了联系的更多相关信息,通过虚线连接一个矩形标识
属性类型
- 简单:不能被划分为子部分,例如性别
- 复合:可以被划分为子部分,称为成员属性,例如住址可以被分为市、区、街道、房号
- 单值:只有一个单独的值,例如身份证号
- 多值:可以有多个不同的值,例如手机号
- 基:直接存储在数据库中的原始数据,例如姓名、住址、出生日期
- 派生:值可以从基属性的值派生出来,并不存储,例如年龄可以从出生日期和当前日期推算出来
2.4 映射基数
映射基数(mapping cardinality):表示一个实体能通过一个联系集关联的其他实体的数量
- 一对一(one-to-one):A中的一个实体至多与B中的一个实体相关联,B中的一个实体至多与A中的一个实体相关联
- 一对多(one-to-many):A中的一个实体可以与B中任意数量的实体相关联,B中的一个实体至多与A中的一个实体相关联
- 多对一(many-to-one):A中的一个实体至多与B中的一个实体相关联,B中的一个实体可以与A中任意数量的实体相关联
- 多对多(many-to-many):A中的一个实体可以与B中任意数量的实体相关联,同时B中的一个实体可以与A中任意数量的实体相关联
E-R图:箭头指向的实体表示只能有一个或最多一个
- 一对一:一个学生最多只有一个导师,一位导师最多只有一位学生
- 一对多:一个学生最多最多有一个导师,但是一个导师可以有多个学生
- 多对一:一个学生可以有多个导师,但是一个导师最多有一位学生
- 多对多:一个学生可以有多个导师,一个导师也可以有多个学生
自定义基数约束:用l..h的形式表示,其中l表示最小基数,h表示最大基数,可以用*表示没有限制,E-R图中在线段上方标识
一对一可以表示为:1..1
一对多可以表示为:1..*
2.5 参与约束
全部(total):实体集E中的每个实体都必须参与到联系集R中的至少一个联系
部分(partial):实体集E中的每个实体可以选择性地参与到联系集R中的一个联系
E-R图:哪边是必须参与的,哪边就用双线标识,例如学生必须有一个导师,但不是所有导师都需要有一个学生,因此联系到学生是双线
3. 主码
3.1 联系集的主码
E-R图:联系集R的主码是那些没有被有向线段指向的实体集的主码的并集
- 一对一:老师id和学生id任选一个作为联系集的主码
- 一对多:学生只能选一个老师,因此学生id可以作为联系集的主码
- 多对一:老师只能有一个学生,因此老师id可以作为联系集的主码
- 多对多:老师id和学生id的组合作为联系集的主码
3.2 实体集类型
| 类型 | 定义 | E-R图 |
|---|---|---|
| 强实体集 | 可以独立存在的实体集,它有自己的主键,不需要依赖其他实体集来唯一标识 | 单边框矩形 |
| 弱实体集 | 不能独立存在的实体集,它依赖于标识性实体集和自己的分辨符属性来唯一标识 | 双边框矩形,属性用下划虚线 |
标识性实体集:是一个概念,指代弱实体集所依赖的实体集
标识性联系:弱实体集与标识性实体集之间的关系,用双边框菱形表示
弱实体集必须参与标识性联系,因此弱实体集到标识性联系是双线标识的
3.3 消除冗余
如果存在两个关系X,Y都有相同属性A,但是A是Y的主码,那么A在X中就是冗余属性,应该设立联系集通过A将X和Y相关联
4. 将E-R图转换为关系模式
4.1 流程
- 转换强实体集
- 为每个强实体集创建一个关系模式
- 实体集的属性转换为关系的属性
- 实体集的主键转换为关系的主键
- 转换弱实体集
- 为每个弱实体集创建一个关系模式
- 弱实体集的属性转换为关系的属性
- 弱实体集的部分键和标识性实体集的主键共同组成关系的主键
- 标识性实体集的主键作为外键引入弱实体集的关系中
- 转换联系集
- 一对一:不需要创建独立的关系模式,将外键添加到查询频率较高的一方
- 一对多:不需要创建独立的关系模式,而是将“一”方的实体集的主键作为外键嵌入到“多”方的实体集中
- 多对多:建立一个独立的关系模式,包含参与联系的实体集的主键作为外键,同时外键的组合作为新关系的主键
- 转换复杂属性
- 为复合属性的每个成员属性创建一个单独的属性
- 为每个多值属性创建一个新的关系模式,其中包含一个外键引用原实体的主码,以及单独一个多值属性的值
例如主码为id=2233的学生有两个手机号110和119,那么就应该在多值属性的student_phone关系中插入两个元组(2233,110)和(2233,119)
4.2 冗余处理
连接弱实体集与其对应的强实体集的联系集的模式是冗余的
如果实体集a在联系集ab中的参与是全部的,那么转换的关系模式a和ab可以合并成单个模式
即使是部分参与,我们也可以通过补空值的方式合并
5. E-R图高级特性
5.1 特化和概化
特化(Specialization):将一个较为通用的实体集细分为多个更具体的实体集,子实体集继承父实体集全部属性,同时也可以拥有自己的属性
概化(Generalization):将一组具有共同特征的实体集归纳为一个更一般的实体集,父实体集包含子实体集所有共同属性
约束
- 不相交约束(disjoint):子实体集之间是互斥的
- 重叠约束(overlappig):子实体集允许有交集
- 完全性约束(total):父实体集中的每个实体必须属于某个子实体集
- 部分性约束(partial):父实体集中的每个实体可以不属于某个子实体集
转换关系模式
- 为每个高层实体集和底层实体集都创建一个关系模式
- 对于每个低层实体集,引用高层实体集的主码作为外码约束,同时也作为主码属性
E-R图:用一个空心箭头从子实体集指向父实体集,又称为ISA联系
5.2 聚集
聚集(aggregation):将联系集本身作为一个整体参与其他联系集
E-R图:使用一个矩形包裹住一个联系和它的参与实体
6. 注意事项
当一个实体集的主码需要作为另一个实体集的属性时,应该通过 联系集 来表示这种关系,而不是直接将主码作为属性
联系集本身已经隐含了参与实体集的主码属性,因此在设计联系集时,不需要显式声明这些主码属性
- 如果一个对象可以独立存在,并且有独特的标识和其他附加信息,就应该使用实体集(地址可以定义为实体集,性别年龄应该被定义为属性)
- 如果是描述发生在实体间的行为且不关联过多的信息,采用联系集
- 如果参与联系的对象总是或大部分只有两个,那么使用二元联系























