Entity-Relationship Modeling – 实体联系建模

1 .实体类型

1.1 实体类型

  • 定义:被企事业单位认可的、能够独立存在的一组具有相同属性的对象
  • ER模型的基本概念是实体类型,实体类型代表现实世界中具有相同属性的一组对象
  • 实体类型能够独立存在,既可以是物理存在的对象,也可以是概念存在的对象
  • 不同的设计人员可能会确定不同的实体

1.2 实体出现

  • 一个实体类型中,每一个可被唯一标识的对象都可以简称为一个实体出现

1.3 实体类型和实体出现的理解

  • 可以简单的将实体类型比作面向对象编程中的类,实体出现比作一个类的对象

1.4 实体类型的图形化表示

mysql中实现实体完整性 mysql什么是实体_mysql

  • 每个实体类型都用一个标有名字的矩形表示,名字通常是名词

2. 联系类型

2.1 联系类型

  • 一个联系类型是一个或多个实体类型间的一组关联
  • 每个联系类型都被赋予一个能够描述其功能的名字

2.2 联系出现

  • 由参与该联系的各个实体类型的一个出现组成的可被唯一标识的关联

2.3 联系类型的度

  • 定义:参与联系的实体类型的个数

2.4 联系类型的图形化表示

  • 简单联系的图形化表示
  • 每个联系类型都表示为用线将相关的实体类型联系起来,并在线上标上联系的名字,通常是一个动词
  • 一个联系还应该标记以一个方向,通常意味着这个联系的名字仅在一个方向上有意义,比如上图中,Branch Has Staff 比 Staff Has Branch有意义得多
  • 复杂联系的图形化表示

mysql中实现实体完整性 mysql什么是实体_外键_02

  • 多元联系,联系的名字放在菱形内部,在这种情况下,与该名字相关联的方向箭头可以省略

2.5 递归联系

  • 同一个实体类型以不同的角色多次(大于1次)参与了同一个联系类型,这种联系类型被称为递归联系
  • 上图表示的联系中,Staff 实体类型同时以 Supervisor 和 Supervisee 角色参与到 Supervises 联系中,所以是一个递归联系

3. 属性

3.1 属性:

  • 实体或者联系类型所具有的某一特性
  • 属性被赋值以后就可以描述每个实体的实例出现,而属性值的集合则是数据库中所存储数据的主要构成

3.2 属性域:

  • 单个属性或多个属性所允许的取值集合
  • 多个属性可以共享一个域

3.3 属性分类

  • 简单属性和组合属性
  • 简单属性 – 又被称作原子属性
  • 由独立存在的单个部分组成的属性
  • 简单属性不能被再划分为更小的属性
  • Example: Staff 实体中的 position 和 salary 属性就是简单属性
  • 组合属性
  • 由多个部分组成的属性,每个部分可以独立存在
  • Example:
  • Branch 实体中的 address 属性值为 (163 Main St, Glasgow, G11 9QX),
  • 这个属性进而可以被划分为 street, city, postcode三个属性
  • 建模时,将组合属性看成一个简单属性,还是作为组合属性而由多个子属性够成,取决于用户数据视图
  • 单值属性和多值属性
  • 单值属性
  • 在实体类型的每个实例出现都只取一个单值的属性
  • 大多数属性都是单值属性
  • 多值属性
  • 对实体类型的某些实例出现可能取多个值的属性
  • 例如,电话号码属性,一个人可能多个电话号码,这时候,电话号码就是多值属性
  • 导出属性
  • 属性的值是从相关的一个或一组属性 (不一定来自同一实体类型) 的值导出来的属性
  • Example: 年龄可以通过生日导出,此时,年龄就是由生日导出的导出属性

3.4 关键字

  • 候选关键字
  • 能够唯一标识每个实体的实例出现的最小属性组
  • 主关键字
  • 被指定用来唯一标识实体类型的每个实例出现的候选关键字
  • 实体主关键字的选择要考虑属性的长度 (长度最小者优先,建立index效率更高),以及该属性在以后是否仍具有唯一性
  • 未被选为主关键字的候选关键字被视为可替换关键字
  • 合成关键字
  • 包括两个或两个以上属性的候选关键字
  • 有些情况下,一个实体类型的候选关键字是由几个属性组成的,这些属性的值组合起来可以唯一标识每个实体的实例出现,但分开来却不行

3.5 属性的图形化表述

  • Example:

mysql中实现实体完整性 mysql什么是实体_外键_03

  • 如果要在一个实体类型中显示它的属性,可以将实体和矩形分成两部分。上面部分是实体的名字,下面部分列出属性的名字
  • staffNo(PK): 用PK标识主关键字
  • / totalStaff : 标识totalStaff是导出属性
  • telNo [1…3] : 多值属性
  • address(street, city, postcode): 组合属性

4. 强实体类型与若实体类型

实体类型可以分为强实体类型和弱实体类型

4.1 强实体类型

  • 该实体类型的存在不依赖于其他属性类型
  • 特征:可以使用该实体类型的主关键字唯一标识每个实体的实例出现
  • Example: Staff实体类型,Branch实体类型……

4.2 弱实体类型

弱实体类型有时也被称为子实体、依赖实体或者从属实体

强实体类型则被称为父实体、所有者实体或支配实体

  • 该实体类型的存在依赖于其他实体类型的存在
  • 特征:仅使用该实体类型的属性无法唯一标识每个实体的实例出现
  • Example:
  • Preference: 指某个顾客喜欢的房间类型,该实体必须依赖于Client实体而存在
  • 脱离了Client实体,Preference实体就失去了意义

5. 联系的属性

mysql中实现实体完整性 mysql什么是实体_mysql_04

  • 在表示与某个联系相关联的属性时,采用与实体类型相同的符号
  • 但是为了区分带有属性的联系与实体,将表示属性的矩形和联系用虚线连接起来

6. 结构化约束

  • 联系上的主要约束称为多重性
  • 多重性:
  • 指一个参与实体类型通过某一联系与另一参与实体类型的某个出现发生关联的出现的数目(范围)
  • 大白话:就是参与联系的实体类型的实体出现的数目(范围)
  • Tip: 并不是所有的完整性约束都可以简单地用ER模型表示。例如,每一名员工每年都会由于在企事业单位工作而得到一天额外地休假,这样的约束是很难用ER模型表示的

6.1 一对一联系

  • Example:
  • Managers关系左边的 1…1 :
  • 表示一个分公司由一个员工管理,所以对每一个 Branch 实例,必须有且只有一个 Staff 实例与之够成一个 Managers 关系实例
  • Managers关系右边的 0…1 :
  • 表示一个员工可能管理一个或零个分公司,所以对每一个 Staff 实例,可以有 0 个或者 1 个 Branch 实例与之够成 Managers 关系实例

6.2 一对多联系

  • Example:
  • Oversees关系左边的 0…1 :
  • 表示一个房产可以由0个或1个员工管理
  • Oversees关系右边的 0…* :
  • 表示一个员工可以管理一处或者多处房产

6.3 多对多联系

  • Example:
  • Advertises关系左边的 0…* :
  • 对于每个待租房产,可以在0或者多份报纸上宣传
  • 左边的0表示,右边的PropertyForRent是可选参与的
  • Advertises关系右边的 1…* :
  • 对于每份报纸,可以宣传1处或者多处房产
  • 右边的1表示,左边的Newspaper是强制参与的

Tip:

mysql中实现实体完整性 mysql什么是实体_mysql中实现实体完整性_05

  • 一个staffNo对应一个position:staffNo和position之间的关系是一对一的,1:1
  • 一个position对应多个satffNo:position和staffNo之间的关系是一对多的,1:*

6.4 复杂联系的多重性

  • 多重性:
  • 在一个 n 元关系中,当其他 (n-1) 个实体类型的值固定以后,另外一个实体类型可能参与联系的实例出现的个数(或范围)
  • Example:
  • Staff 边上的 1…1 :
  • 表示当 Client 和 Branch 实例确定之后,有且仅有一个 Staff 实例能参与够成 Registers 关系
  • Client上方的 0…* :
  • 表示当 Staff 和 Branch 实例确定之后,可以有0个或者多个Client实例参与够成 Registers 关系
  • Branch左边的1…1 :
  • 表示当 Staff 和 Client 确定之后,有且仅有一个 Branch 实例参与构成 Registers 关系

6.5 基数约束和参与性约束

  • 基数:
  • 在指定的联系类型中,一个实体可能参与的联系出现的最大数目
  • 参与性:
  • 说明所有实体出现是否都参与了联系
  • 强制参与:
  • 在一个联系中,所有实体出现都参与了该联系
  • 可选参与:
  • 只有一部分实体出现参与了该联系

mysql中实现实体完整性 mysql什么是实体_mysql中实现实体完整性_06

7. ER模型转换成关系

  1. 三条核心规则
  1. 实体 --> 转换成表
  2. 一对多 / 一对一的联系 --> 外键
  3. 多对多的联系 --> 成表
  1. ER模型转换成关系:创建逻辑数据模型的关系,来表示已经被定义好的实体、联系和属性
  2. Tip : 1…1 是用在关系图形化中,详细见本笔记 6.结构化约束
  3. 1:1 表示两个实体够成的关系是1对1的,冒号左右两边的1都表示对应实体的基数
  4. 为了区分ER模型中实体之间的关系和关系数据模型中的关系,以下内容中,关系统一指ER模型中实体之间的联系,表指关系模型中的关系

7.1 Strong entity types

  • 创建一个包括实体所有简单属性的表,对于组合属性,仅仅包括组成组合属性的子属性

7.2 Weak entity types

  • 创建一个包括实体所有简单属性的表,主键部分或者完全来自父实体

7.3 1 : * Binary relationship

  • 1 对应的属性作为父表,* 对应的属性作为子表
  • 父表中的主键被复制进子表作为外键
  • Example :

7.4 1 : 1 Binary relationship types

参与够成关系的两个实体类型基数都是1

  • 更加复杂,因为在一个关系中,基数不能被用来标识父实体和子实体
  • 基数都为1,并不能直接确定实体的父子关系
  • 可参与性可以确定,将所有实体结合设计成一个表,还是创建两个表,然后将一个表的主键复制进另外一个表作为外键
  • 参与够成关系的实体双方都强制参与 :
  • 将两个实体包含进一个表,选择其中一个实体的主关键字作为表的主键,另一个实体的主关键字作为表的可选键
  • 参与够成关系的实体双方有一方强制参与 :
  • 用可选参与限制,确定实体的父子关系
  • 可选参与的一方作为父实体
  • 将父实体对应的父表的主键复制进子实体对应的子表中,作为子表的外键
  • Example:
  • 参与够成关系的实体双方都是可选参与 :
  • 父表和子表的确定是任意的,除非能够找到更多信息

7.5 1 : 1 Recursive relationships - follow rules for participation for a 1 : 1 relationship

Tip: 递归关系, 基数为1

该关系中, 实体类型作为两种角色, 例如同学和班长, 同时属于学生实体

  • 两种角色都是强制参与的
  • 创建一个表,该表中,实体的主关键字出现两次,一次作为表的主键,一次作为表的外键(参照到自身)
  • 两次出现必须进行重命名,保证表的属性不重名
  • 两种角色有一方是可选参与的
  • 第一种方案:
  • 和两种角色都强制参与相同
  • 第二种方案:
  • 创建两个表,表 A 代表该实体,表 B 代表实体之间的递归关系
  • 表B中,只有主关键字的两个备份,一个作为表B的主键,一个作为表B的外键
  • NewRelation (primaryKey, primaryKey as newName)
  • 两种角色都是可选参与的
  • 两种角色有一方是可选参与 的 第二种方案 相同

7.6 * : *Binary relationship types

二元关系,两个实体类型的基数都大于1

  • 创建以一个 表A 来代表实体之间的关系,表中包括关系的所有属性
  • 将两个实体的主关键字都复制进 表A 中,都作为外键存在
  • 两个实体的关键字和关系本身的某些属性一起形成外键
  • Example:

7.7 Complex relationship types

  • 创建一个表来表示实体之间的联系,表包括联系的所有属性
  • 将所有参与够成联系的实体的主关键字都复制进表中,作为外键存在
  • 所有实体的主关键字和关系本身的某些属性一起形成表的主键
  • Example:

7.8 Multi-valued attributes

含有多值属性

  • 创建以一个表代表多值属性,在表中包含实体的主关键字作为外键
  • 除非多值属性本身是实体的可选关键字,新表的主键由多值属性的值和实体的主关键字组成