ER 图是什么?这一篇让你搞懂 ER 图! - 知乎 (zhihu.com)
数据库设计核心就是
1 理解用户需求
2 使用E-R关系模型,绘制E-R图
3 将E-R关系模型转换为数据库表
本节核心在第二部分到第三部分
E-R模型实际上是由多个实体集(含有不同属性)和联系集组成
实体 Entity 是一个物体,客观存在并且相互区别
比如一个学生,一个公司
实体集合 Entity Sets 具有相同属性的实体的集合
比如一群学生,一系列公司
属性 Attributes
比如ID,姓名,这些属性能够区别不同的实体
就好比我们每个人都有自己的特征,这些特征区分了不同的实体
除了基本属性还有如下一些属性概念需要了解
**简单属性 Simple 和复合属性 composite **
单值属性 Single-valued和多值属性 multi-valued
**派生属性 Derived attributes **
可以从一个已知的属性的值推理出来,比如知道出生可以退出年龄
所以年龄就是一个派生属性
描述属性 descriptive attributes
描述属性一般都是给关系集合的,
如学生实体集合Student和考试实体集合section通过take(参加)这一个关系集合联系起来,那么take这个关系集合可以用grade成绩这一属性来描述
关系 Relationship 在一些实体中的关系
**关系集合 Relationship Sets ** 相同类型的关系的集合
关系集合往往要建立多个实体集的关系
递归关系集合 Recursive relationship set
同一实体集以不同的角色多次参与关系集。
二元关系
只包含两个实体集的关系
非二元关系集合
含超过两个实体集的关系
E-R diagram ER关系图
1 矩形表示一个实体集,矩形上方写实体集的名字
2 实体集的属性一个一个列在矩形框内,用下横线标识主键
举例如下 Student表的关系图绘制
1 用一个菱形方块代表关系集,连接多个实体集矩形
举例如下 advisor代表一个关系集
2 上面讲到描述性属性,用虚线表示,如下
上面我们讲完了实体集的一些初步介绍,接下来重点讲其中一些部分
Mapping Cardinalities 映射基数 表示另一个实体可以通过关系集与之关联的实体数。
有以下几种类型
一对一,一对多,多对一,多对多
一对一 one to one:一个导师最多指导一个学生,一个学生最多被一个导师指导。说明导师可以不指导学生,学生也可以单干。
绘制E-R图如下 左右各一个箭头
一对多 one to many:一个导师可以指导任意多个学生,一个学生至多被一个导师指导。
绘制E-R图如下 只有one的那一侧有箭头
多对一 many to one:一个导师至多指导一个学生,一个学生可以被任意个导师指导。
绘制E-R图如下 只有one的那一侧有箭头
多对多 many to many:一个导师可以指导任意学生,一个学生可以被任意多个导师指导。
说明导师可以不指导学生,也可以指导好些个。学生可以单干,也可以多拜几个师傅
绘制E-R图如下两侧都没有箭头
总结:one指向的那一侧是箭头->
对于以上的各种关系,每一个advisor关系集合的超键都由各个实体集合的主键并集组成
但是超键却不太一样,一般选择many那一侧的主键做关系集合的主键
多对多
一对多
一对一
Total and Partial Participation 全部或部分参与
如下图所示,绘制E-R图时候 双线代表全部,单线代表部分
学生一侧是全部,含义代表每一个学生必须有一个指导老师
导师一侧是部分,含义代表有些老师指导学生,有些老师不指导学生
在之前的基础上,可以加数量上的范围约束
E-R关系图上用双点表示, *表示无限制
格式
最小值..最大值
举例如下
含义如下
左侧老师一侧:0…* 代表一个指导老师能够指导0个或者更多个学生,没有上限
右侧学生一侧:1…1 代表一个学生至少1 个老师,至多也只有1个指导老师
超键是都有的
但主键根据情况不同而不同
比如
他的存在依赖于另一个实体集(被依赖的那个称作标识实体集identifying entity sets)
比如 考试这个存在就是依赖于课程的存在,所以课程实体集叫做标识实体集identifying entity sets,考试这个实体集叫做弱实体集Weak Entity Sets
E-R图中,用双框矩形表示,关系集合由双框菱形组成,虚线代表辨别属性
如下图所示
该关系集合sec_course 的主键由标识实体集的主键和弱实体集的辨别属性(即虚线画出来的)一起构成
弱实体集那一侧一定是全部total participation
初步解决
对于强实体集而言有着简单的属性,直接转即可
举例如下
对于强实体集有着复合属性,转换后成为一个一个简单属性(复合属性不会出现在其中)
举例如下
对于多值属性而言如电话号码,我们再创建一个新的表
派生属性不要出现在表中,直接计算得到
弱实体集形成新的表包含标识实体集的主键和它自己的属性
举例如下
多对多
两个实体集的主键+他自己的描述属性
多对一
优化如下
一对一
优化如下
问题一:假设一个部分可能有许多不同的分配。
解决:使用多值复合属性赋值
问题二:假设有关于作业的其他信息,例如最高分或截止日期
解决:将叶属性添加到分配属性
但是问题二有冗余问题
将赋值模型建模为由部分标识的弱实体集
Person可以经过Specialization(特化)称为两个小的如学生也是雇员
实体集可以包括实体的子分组,这些实体在某种程度上与集中的其他实体不同。
较低级别的实体集继承(inheritance)了较高级别实体集的所有属性和关系参与。
多重继承 简单继承
例如 人员集包括子组——员工集和学生集
重叠(Overlapping)——一个实体可能属于多个专用实体集,约束要求一个实体可以属于多个较低级别的实体集如,一个人可能既是学生也是雇员
不相交(Disjointness)——一个实体最多必须属于一个专用实体集,约束要求一个实体只能属于一个较低级别的实体集,如一个人只能是雇员里的前台柜员或者秘书之一
通过架构表示 IS-A 关系
方式一
建立一个高水平实体集的架构,建立一个低水平的架构。通过外键建立两个练习
缺点:获取有关的信息,一个员工需要访问两个关系(低级架构和高级架构)
方式二
使用所有本地属性和继承属性为每个实体集形成架构
缺点:冗余
用聚合的方式
使用聚合 – 可以将聚合实体集视为单个单元,而不考虑其内部结构的细节。
聚合是一种抽象,通过该抽象,将关系视为更高级别的实体