数据库的设计通常需要经历四个部分:
- 需求收集与分析(Requirements Collection and Analysis)
- 概念设计(Conceptual Design) —— 设计实体关系模型 (ER Model)
- 逻辑设计(Logical Design)—— 实现从 ER 模型到关系模式(Relation Schemas)的转换。
- 物理设计(Physical Design)
本文主要介绍一下概念设计的部分。
概念设计
概念设计是一个构建概念数据模型的过程,这个概念数据模型在抽象的高层建模;需要足够简单且通常是图形化的;并且能够用于与非技术用户交流数据库的需求。这里主要介绍如何使用 ER 模型来实现概念设计。
ER 模型
ER 模型主要有三个关键方面:
- 数据结构:ER 模型中的数据表现为实体与属性之间的关系
- 数据完整性:对于ER模型,键(key)用于实体或者关系类型,而基数约束或者参与约束用于关系类型。
- 数据操作:ER 模型中不存在对数据的任何操作。
ER 模型中的关键概念与关系型数据库的概念联系如下:
关系型数据库 | 实体关系模型 |
---|---|
属性 | 属性 |
域 | 域 |
超键 / 主键 / 候选键 | 超键 / 主键 / 候选键 |
元组 | 实体 / 关系 |
关系 | 实体集合 / 关系集合 |
关系模型 | 实体类型 / 关系类型 |
ER 模型的基本图表元素有:
属性(椭圆) | 用于描述实体或者关系的性能或者特征 | |
主要属性(内含下划线的椭圆) | 能够用于识别特定实体的属性 | |
实体(长方形) | 在现实世界中独立存在的单一个体类别 | |
关系(菱形) | 实体之间的联系 |
实体类型与实体集合
实体类型定义了一个拥有相同属性的实体的集合。
实体集合是指在特定时间下,数据库中所有实体类型的集合。
对于某一个特定的实体以及其属性,可以用下面的形式表示:
实体名为员工(Employee),该实体类型的属性包括工号(SSN)、姓名,工资和地址。需要注意的是,在这里工号是主属性(下划线),地址是一个多值属性(双椭圆),意味着地址这个属性对于同一个实体而言,允许拥有一个或者一个以上的值。
弱实体类型
弱实体类型指的是一个实体类型没有足够的属性来构建一个能够识别特定个体的主键,因此它需要依赖一个能够被确定的实体才能存在。弱实体类型必须拥有一个或者多个属性,其中包括弱主键,与其所依赖的实体的主键共同作为该弱实体类型的主键,从而识别特定的个体。表示如下:
在这里,儿童(Child)是一个弱实体类型,不同的儿童可能会拥有相同的姓名和年龄,因此把儿童这个实体与员工建立依赖关系,其关系为员工-拥有(has)-儿童,通过 SSN 和 Cname 共同构建能够识别特定儿童的主键。
关系类型与关系集合
关系类型指的是多个实体之间的联系,该联系允许拥有隶属于这段联系的独立的属性。
关系集合指的是某个特定关系类型联系的所有实体的集合。
表示形式如下:
这里有两个实体,员工(Employee)和部门(Department),员工在部门里工作,这是它们之间的关系。
在现实世界里,实际上还可能会出现更加复杂的实体关系模型,比如递归关系:
在这里,员工之间存在监督者与下属之间的关系,监督者监管下属,而监督者和下属同样都属于员工,并且拥有员工的属性。
还有更高程度的关系:
在这个关系里,提供商(Supplier)为项目(Project)提供零件(Part),因此提供(Supply)这个关系同时涉及到三个实体,且该关系还具有数量(Quantity)这个属性。
关系中的约束
ER 模型中的约束关系通常是指实体与实体之间基于某种关系下的约束。主要包括两种:
- 基数比例(Cardinality ratios):指定实体允许参与到关系中的最大数目。
- 参与约束(Participation constraints):指定某个实体在其与其他实体的依赖关系中是否必然存在。
基数比例(Cardinality ratios)
基数比例的类型主要有三种:多对多(Many-To-Many)、一对多(One-To-Many)、一对一(One-To-One)。
-
多对多(Many-To-Many)
含义:一名员工可以为多个部门工作;一个部门里允许拥有多名员工。
-
一对多(One-To-Many)
含义:一名员工最多只能为一个部门工作;一个部门里允许拥有多名员工。
-
一对一(One-To-One)
含义:一名员工最多只能为一个部门工作;一个部门里最多只允许有一个员工。(虽然这不符合现实。。。)
在以上三种类型的基础上,ER 模型还延伸出一种约束:基数限制。主要含义就是通过一个整数来指定两个实体在关系中允许参与的数量范围。表示如下:
含义:一个员工必须为一个且最多一个部门工作;一个部门必须拥有一个或者多个员工。
参与约束(Participation constraints)
参与约束主要分为两种:完全参与(Total)和局部参与(Partial)。一般情况下,默认为局部参与。
-
完全参与(Total)
含义:每一名员工必须为一个部门工作;一个部门可能有或者没有员工。
-
局部参与(Partial)
含义:一名员工可能有或者没有为一个部门工作;一个部门可能有或者没有员工。
实体类型中的父类与子类
实体类型的父类与子类指的是拥有不同名称的同一个概念,子类通常是父类实体根据其具体的应用意义所采用的的更加显式的表达。父类与子类之间的关系被称为 ISA 关系类型。
专门化(Specialisation)与一般化(Generalisation)
专门化指的是自上而下定义一个实体所拥有的子类的集合。
一般化指的是自下而上地把拥有共同属性的多个子类归纳成一个单一的父类。
在上图中,员工(Employee)是父类,其子类根据不同的实际意义分别为秘书(Secretary)、技术员(Technician)和工程师(Engineer)。该图实现专门后就能得到下面的图:
图中的三个子类通过一般化以后,就能得到前一个图。
分离约束(Disjointness constraint)
分离约束主要是用于指定通过专门化产生的子类之间的关系。子类间的分离约束主要有两个方面:
- 分离(disjoint):子类的各个实体之间完全分离,不存在任何交集。
-
重叠(overlap):子类的各个实体之间可能存在某些交集,即某个父类的实体,既可以当做其中一个子类实体,也能当做另一个子类实体。
不同的分离约束在 ER 模型中的表示形式如下:
完整性约束(Completeness constraint)
- 完全约束(Total):每一个父类的实体必然属于至少一个子类的成员。
- 部分约束(Partial):父类的实体可能不属于任何一个子类(默认约束)。
构建 ER 模型的流程
- 识别所以实体类型(包括弱实体类型);
- 识别所有关系类型(包括 ISA 关系和依赖关联);
- 识别所有实体和关系类型对应的属性(以及每个属性的定义域);
- 识别每个实体的主键;
- 辨别步骤 2 中找出的所有关系中的基数比例;
- 确定上述关系的参与约束;
- 确定 ISA 关系中的分离约束和完整性约束。
软件支持
网络上有很多软件能够用来画 ER 模型,比较常用的一个轻量级软件是 TerraER, 它是一个基于 JRE 运行的软件,支持Windows,Mac,Linux环境,能够生成 ER 模型的 XML 文件以及 JPEG 图片。
下载链接:https://github.com/rterrabh/TerraER/releases/download/TerraER3.01/TerraER3.01beta.jar