一. 数据库设计过程的概述

1. 基本概念

(1). 数据库设计定义

数据库设计就是根据各种应用处理的要求、硬件环境及操作系统特性等,将现实世界中的数据进行合理组织,并利用已有的数据库管理系统(DBMS)来建立数据库系统的过程。

2. 设计流程

(1). 需求分析(设计的基础、最困难、最耗时)

1. 目的

了解和分析系统将要提供的功能及未来数据库用户的数据需求

2. 系统需求分析流程
① 需求概述和系统边界
② 主要业务处理流程
③ 功能需求分析
④ 数据需求分析
⑤ 业务规则及完整性约束分析
3. 结果

这一阶段分析的结果是形成用户的需求规格说明

(2). 概念设计

1. 要求

根据需求分析中得到的信息,设计者次阶段需选择适当的工具将这些需求转化为数据库的概念模型

2. 流程

一般是建立各个子系统(即对应外模式的局部应用)的概念模型,再综合得到整个系统的概念模型。

3. 主要内容

我们主要基于E-R模型的数据库概念设计,通过实体、联系、属性等概念和工具精确的描述系统的数据模型,不受采用逻辑数据模型的限制影响,根据数据库系统的具体实现转换为特定的逻辑数据模型

4. 主要步骤
① 确定基本实体集及属性
② 主要业务局部概念建模
③ 定义联系集及属性
④ 画出完整的E-R图

(3). 逻辑设计

1. 步骤

将数据库的概念设计转化为所选择的数据库管理系统支持的逻辑数据模型,即数据库模式

(4). 模式求精

1. 目的

以关系数据理论作为指导,对已得到的关系数据库模式进行分析,找出潜在的问题并加以改进和优化,如减少数据冗余,消除更新、插入、删除异常

2. 定义

模式求精是运用关系理论(如函数依赖理论、多值依赖理论等)对已有的关系模式进行结构调整、分解、合并、优化,以满足应用系统的功能和性能需求

3. 步骤

数据库系统原理——数据库建模_实体集

(5). 物理设计

1. 概念

考虑数据库要支持的负载和应用需求,为逻辑数据库选取一个最合适现实应用的物理结构

包括数据库文件组织格式、内部存储结构、建立索引、表的聚集

2. 目标
  1. 提高数据库性能,以满足应用的性能需求
  2. 有效利用存储空间
  3. 在性能和代价之间做出最优平衡
3. 数据库的物理结构依赖DBMS和运行环境,设计人员要考虑以下内容
  1. 数据库的物理组织
  2. 确定数据存储结构
  3. 确定数据存取路径
  4. 确定系统配置
  5. 物理结构评价
  6. 影响物理设计的主要因素

(6). 应用与安全设计

1. 数据库系统安全要求

数据库系统必须指出哪些用户可以访问数据库以及它们通过哪些存储过程访问数据库,还要描述每个用户在每个过程所扮演的角色,对每个角色必须明确指出它们能够存取数据库的哪些部分

二. 数据设计流程的详解

2.1 概念设计——E-R模型

2.1.1 E-R模型基本概念及表示

在现实世界中,事物内部以及事物之间存在着各种各样的联系
事物内部的联系表现为组成事物的各个特征之间的联系
事物之间的联系表现为不同事物之间的联系

E-R模型采用实体集、联系集、属性3个基本概念分别描述事物、联系、特征

(1). 实体与实体集
1. 什么是实体?
客观世界中可区别于其他事物的“事物”或“对象”

实体既可以是有形的、实在的事物,也可以是抽象的,概念上存在的事物
2. 实体的特征
独立存在
可区别于其他事物
3. 什么是实体集
具有相同类型即相同性质的实体集合
4. 实体集的特征
实体集可以相交
5. 实体集的分类
  1. 弱实体集
定义:实体集中属性不足以形成主码,它们必须依赖于其他实体集的存在而存在
  1. 强实体集
定义:实体集中的属性可以自己形成主码
(2). 属性
1. 什么是属性?
实体是通过一组属性来描述的,属性是实体集中每个实体都具有的特征描述
2. 属性的特征
在一个实体集中,所有实体都具有相同的属性

对于一个属性来说,每个实体都拥有自己的属性值
3. 属性的域
一个属性所允许的取值范围或集合
4. 描述学生实体集的数据字典

数据库系统原理——数据库建模_函数依赖_02

5. 属性的分类

数据库系统原理——数据库建模_函数依赖_03

  • 简单属性
定义:不能再分为更小部分的属性
  • 复合属性
定义:可以进一步划分为更小部分的属性

举例:
学生实体集的家庭住址,划分为省、市、街道
  • 单值属性
定义:某属性对一个特定实体任何时候都只能有单独一个值

举例:学生实体中的学号
  • 多值属性
定义:某属性对一个特定实体任何时候可能有多个值

举例:学生实体集的电话号码
  • 派生属性
定义:属性的值可以从其他相关属性或实体派生出来

举例:学生实体集的年龄、学生实体集已修学分

注:

当实体在某个属性上没有值或值未知时可使用空值(NULL)
6. 多值属性的变换
  1. 方案一
    方法:将多值属性转换为多个单值属性进行表示

    缺点:
  1. 缺少弹性,当需要增加电话时,需要修改模型
  2. 浪费存储空间,不是所有学生都有4个电话
  1. 方案二
    方法:将多值属性单独建模为一个弱实体集,他依赖于原实体集而存在
  2. 数据库系统原理——数据库建模_数据库_04

(3). 联系与联系集
1. 什么是联系?
指多个实体间的相互关联
2. 什么是联系集
指同类联系的集合
3. 多联系
多个不同的联系集定义在一些相同的实体集上

数据库系统原理——数据库建模_数据库_05

4. 实体的角色
定义:实体在联系中的作用

特点:
由于参与一个联系的实体集通常是不同的,因而角色是隐含的并且常常不需声明

当参与联系集的实体来自相同的实体集时,就需要声明角色

数据库系统原理——数据库建模_数据库_06

5. 联系集的度
定义:参与联系集的实体集的数目

注:数据库系统大多数联系集都是二元的
(4). 使用E-R图来表示实体集、属性、联系

数据库系统原理——数据库建模_数据库_07


数据库系统原理——数据库建模_数据库_08

2.1.2 约束

(1). 映射约束
1. 什么是联系集R的映射基数
实体集A中的一个实体通过某联系集R能与实体集B中的实体相联系的数目
2. 二元联系中,映射基数分类
(1). 一对一
  1. 定义
    A中的一个实体至多同B中的一个实体相联系,B中的一个实体至多同A中的一个实体相联系
  2. 举例:实体集销货单和发票参与的联系集开发票
  3. 数据库系统原理——数据库建模_实体集_09

(2). 一对多
  1. 定义
    A中的一个实体至多同B中的任意数目的实体相联系,而B中的一个实体至多同A中的一个实体相联系
  2. 举例:实体集班级和学生参与的联系集包含
  3. 数据库系统原理——数据库建模_实体集_10

(3). 多对多
  1. 定义
    A中的一个实体可以同B中任意数目的实体相联系,而B中的一个实体也可以和A中任意数目的实体相联系
  2. 举例:实体集学生和课程参与的联系集选课
  3. 数据库系统原理——数据库建模_实体集_11

(4). 使用E-R图来反映联系集的映射基数

数据库系统原理——数据库建模_数据库_12

(5). 什么类型联系集可以有自己的联系属性
  1. 多对多的联系集
  2. 数据库系统原理——数据库建模_函数依赖_13

  3. 一对多的联系集
  4. 数据库系统原理——数据库建模_数据库_14

(2). 码约束
1. 实体集的码

超码
候选码
主码

详细见:数据模型章节
2. 联系集的码

数据库系统原理——数据库建模_实体集_15

3. 联系集的属性安置

联系集可以有属性,也可以没有属性,要根据应用语义而定,但多值联系必有属性

二元联系集的属性安置,要根据联系集的映射基数而定

  1. 一对一联系集的属性:可以安置在任一边的实体集上
  2. 一对多联系集的属性:可安置在联系集上,也可安置在多的那一边的实体集上
  3. 多对多联系集的属性:描述相关联实体集间的交互性语义,只能安置于联系集上
(3). 依赖约束

实体集间的联系含有各种不同的语义,各实体在联系集中的成员资格也不一样。有的实体集完全独立于其他实体集而存在,有的实体集依赖于另一实体集的存在而存在

1. 定义
指联系中一种实体的存在依赖于该联系集中联系或其他实体集中的实体的存在
2. 分类
实体集与联系集之间的依赖约束
指联系中一种实体的存在依赖于该联系集中联系的存在

依赖实体集:依赖于联系集而存在的实体集

数据库系统原理——数据库建模_数据库_16

实体集之间的依赖约束
指联系中一种实体的存在依赖于其他实体集中实体的存在

弱实体集:依赖于其他实体集而存在的实体集
(4). 参与约束
分类
  1. 实体集A全部参与联系集R
定义:实体集A中的每个实体都参与到联系集R中至少一个联系集

E-R图表示方法:使用双实线表示
  1. 实体集A部分参与联系集R
定义:实体集A中只有部分实体集参与到联系集R的联系中
(5). 多值联系
1. 定义

指在同一个给定的联系集中,相关联的相同实体之间可能存在多个联系

2. 举例

数据库系统原理——数据库建模_数据库_17

3. 上述E-R模型存在的问题
  1. 问题一:
    当一个客户向同一银行申请多笔贷款时,则联系集中无法唯一标识一个联系
    (即贷款不仅是一个多对多联系,还是一个多值联系)
  2. 问题二
    如果有多个银行联合发放一笔贷款,或由多个用户共同借一笔贷款,则会出现数据冗余问题
    (在联系集中反映该笔贷款的贷款编号、贷款日期、等重复多遍)
4. 解决办法

将多值联系建模为依赖实体集弱实体集

2.1.3 弱实体集

1. 什么是弱实体集
实体集中属性不足以形成主码,它们必须依赖于其他实体集的存在而存在
2. 标识实体集
弱实体集所依赖的强实体集称为标识实体集
3. 标识联系集
弱实体集与一个标识实体集的联系
4. 部分码
对于给定的标识实体集,一个弱实体集中用来标识弱实体集的属性(集)称为该弱实体集中的部分码

弱实体集中的实体由其标识实体集中的主码与其部分码共同标识
5. E-R图实例

数据库系统原理——数据库建模_函数依赖_18

6. E-R表示弱实体集
  1. 双矩形表示弱实体集
  2. 双菱形表示标识联系集
  3. 虚下划线表示弱实体集部分码

注:

标识联系集可以不需要联系属性,因为任何所需的联系属性都可直接定义为弱实体集的属性
7. 弱实体集的适用范围
(1). 多值联系建模为弱实体集
(2). 多值属性转换为弱实体集

2.1.4 扩展E-R模型

(1). 类层次
  1. 什么是ISA
    表示高层实体和低层实体之间的“父类-子类”联系,称为类层次或属性继承(子类继承父类所有属性)
  2. E-R模型实例
    E-R模型使用实体集的继承和ISA联系来描述这种概念上的层次关系
  3. 数据库系统原理——数据库建模_实体集_19

(2). 聚合
1. 什么是聚合?
聚合是一种抽象,它将一个联系集及其相关联的实体集抽象为一个联系实体集对待,
然后建立该联系实体集与其他实体集之间的联系集

适用于:建立联系集间的联系
2. 聚合的E-R建模
  1. 方式一
  2. 方式二

2.1.5 E-R模型建模问题

(1). E-R建模的基本原则

  1. 忠实性

    设计应忠于应用需求,即实体集、联系集、属性都应当反映现实世界
  2. 简单性

  3. 避免冗余

    一个原则是:一个对象只存放在一个地方
  4. 选择实体集还是属性

  5. 满足以下规则可作为属性对待
  6. 数据库系统原理——数据库建模_数据库_20

  7. 选择实体集还是联系集
  8. 数据库系统原理——数据库建模_函数依赖_21

  9. 多元联系转化为二元联系

举例一:

数据库系统原理——数据库建模_实体集_22


举例二:

数据库系统原理——数据库建模_实体集_23

(2). 依赖约束的建模

(3). 多值联系的建模

1. 将多值联系建模为弱实体集
2. 将多值联系建模为依赖实体集

2.1.6 数据库概念设计实例

大学选课系统

2.2 逻辑设计——E-R模型转换为关系模型

2.2.1 E-R模型转化方法

(1). 强实体集转化方法

(2). 弱实体集转化方法

(3). 复合属性及多值属性转化方法

(4). 类层次转化方法

(5). 聚合转化方法

2.2.2 E-R模型转化实例

大学选课系统

2.3 数据库模式求精

2.3.1 设计数据库出现的问题

(1). 数据冗余导致的问题

  1. 什么是数据冗余

    指同一信息在数据库中存储了多个副本
  2. 数据冗余会导致什么问题
  3. 数据库系统原理——数据库建模_函数依赖_24

  4. 解决方法
  5. 数据库系统原理——数据库建模_数据库_25

(2). 模式分解导致的问题

  1. 模式分解引出的问题
  2. 数据库系统原理——数据库建模_数据库_26


  3. 如何解决呢?

问题一的解决办法

数据库系统原理——数据库建模_函数依赖_27


问题二的回答

一些基本概念:
有损分解:模式分解后再通过连接后所得到的信息变少了
无损分解:通过连接分解后所得到的较小关系完全还原被分解关系的所有实例

保持依赖:被分解关系模式上的所有依赖关系都在分解得到关系模式上保留
没有保持依赖:模式分解之后部分属性之间的依赖关系丢失

所以:不是所有的模式分解都是有益的

2.3.2 模式求精的要求和解决办法

(1). 模式求精的要求

减少冗余进行模式分解,分解后的模式是具有无损连接、保持依赖的特性

(2). 模式求精的解决办法

通过以下方法解决数据冗余和模式分解带来的问题:

  1. 函数依赖
  2. 范式
  3. 函数依赖理论
  4. 模式分解算法

2.3.3 函数依赖定义

函数依赖(functional dependency ,FD)是一种完整性约束,是现实世界事物属性之间的一种制约关系,它广泛的存在于现实世界之中

函数依赖指关系模式中属性之间存在的一种约束。这种约束关系既可以是现实世界事物或联系的属性之间的客观存在的约束,也可以是数据库设计者根据应用需求或设计需要强加给数据的一种约束
无论什么约束,进入数据库的数据都要严格遵守

(1). 什么是函数依赖

数据库系统原理——数据库建模_数据库_28


数据库系统原理——数据库建模_数据库_29

(2). 函数依赖的说明

数据库系统原理——数据库建模_函数依赖_30

(3). 函数依赖的分类

数据库系统原理——数据库建模_实体集_31

1. 平方与非平凡函数依赖
  1. 定义
  2. 数据库系统原理——数据库建模_实体集_32

  3. 注:
  4. 数据库系统原理——数据库建模_数据库_33


2. 完全函数依赖和部分函数依赖
  1. 定义
  2. 数据库系统原理——数据库建模_实体集_34

  3. 举例理解完全、部分依赖
  4. 数据库系统原理——数据库建模_函数依赖_35

  5. 部分函数依赖的问题

    导致数据冗余集各种异常

3. 传递函数依赖
  1. 定义
  2. 数据库系统原理——数据库建模_实体集_36

  3. 举例理解传递函数依赖
  4. 数据库系统原理——数据库建模_数据库_37

  5. 传递函数依赖带来的问题

    导致数据冗余及产生各种异常(更新异常、插入异常、删除异常)

2.3.4 范式

1. 出现原因

判断一个关系模式,缺点他的设计好坏,设计不好就要将其分解为一些小的关系模式,来减少数据库中数据冗余的过程

所以我们要了解当前关系模式中属性之间的关系(范式)

2. 定义

范式来自英文Normal form,简称NF。
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式

3. 分类

数据库系统原理——数据库建模_数据库_38


上述范式一级比一级要求得严格,一般来说,数据库只需满足第三范式(3NF)就行了他们之间的联系:

数据库系统原理——数据库建模_实体集_39


数据库系统原理——数据库建模_数据库_40

4. 第一范式:表中无表

  1. 定义
  2. 数据库系统原理——数据库建模_实体集_41


  3. 第一范式目标
  4. 数据库系统原理——数据库建模_函数依赖_42


  5. 举例
  6. 数据库系统原理——数据库建模_函数依赖_43


5. 第二范式:非主属性完全依赖于候选码的整体

  1. 定义
  2. 数据库系统原理——数据库建模_数据库_44


  3. 数据库系统原理——数据库建模_数据库_45


  4. 举例
  5. 数据库系统原理——数据库建模_数据库_46


数据库系统原理——数据库建模_函数依赖_47


数据库系统原理——数据库建模_函数依赖_48

解决办法:

数据库系统原理——数据库建模_函数依赖_49

  1. 总结
  2. 数据库系统原理——数据库建模_数据库_50

  3. 第二范式目标
  4. 数据库系统原理——数据库建模_实体集_51

  5. 第二范式的缺点
  6. 数据库系统原理——数据库建模_数据库_52

    主属性:studentNo(也就是候选码)
    非主属性:classNo, className, institute
    因为:非主属性依赖于全部的候选码,所以是第二范式
    但是也存在了部分非主属性不是直接依赖候选码,而是依赖其他非主属性

    数据库系统原理——数据库建模_数据库_53

6. 第三范式:所有非主属性都直接依赖于候选码的整体

  1. 定义

    数据库系统原理——数据库建模_实体集_54

  2. 第三范式的目标是:

    数据库系统原理——数据库建模_实体集_55

    对于非3NF的关系模式,通过分解进行规范化,以消除部分依赖和传递依赖
  3. 举例理解
  4. 数据库系统原理——数据库建模_实体集_56


  5. 数据库系统原理——数据库建模_函数依赖_57


  6. 数据库系统原理——数据库建模_实体集_58


  7. 数据库系统原理——数据库建模_实体集_59

7. 巴斯-科德范式(BCNF):消除主属性对码的部分和传递依赖

  1. 为什么需要BC范式
  2. 数据库系统原理——数据库建模_函数依赖_60

  3. 定义
  4. 数据库系统原理——数据库建模_实体集_61

  5. 满足BCNF的关系模式必然满足下列结论
  6. 数据库系统原理——数据库建模_函数依赖_62

2.3.5 函数依赖理论

1. 函数依赖集闭包

  1. 引出问题一

    对于给定的关系模式r(R)及其函数依赖集F,有时候只考虑给定的函数依赖集是不够的,而需要考虑在r(R)上总是成立的所有函数依赖

  2. 举例:为什么只考虑给定的F是不够的

    原因:通过方法证明,给定的函数依赖可以引出新的函数依赖

    数据库系统原理——数据库建模_数据库_63

  3. 引出定义一

    数据库系统原理——数据库建模_数据库_64

  4. 什么是闭包
  5. 数据库系统原理——数据库建模_数据库_65

  6. 如何计算给定函数依赖集F的闭包
  7. 数据库系统原理——数据库建模_数据库_66

  8. 举例:理解通过Armstrong公理求函数依赖集闭包
  9. 数据库系统原理——数据库建模_实体集_67

2. 属性集闭包

  1. 为什么需要属性集闭包

    如果想要判断一个给定的函数依赖α→β是否在函数依赖集F的闭包中,不用计算F+就可以判断出来,通过计算属性集闭包方式来判断

  2. 属性集闭包的定义

    数据库系统原理——数据库建模_实体集_68

  3. 属性集闭包计算方法

数据库系统原理——数据库建模_函数依赖_69

举例理解

数据库系统原理——数据库建模_数据库_70

  1. 计算属性集闭包的作用
  2. 数据库系统原理——数据库建模_实体集_71


  3. 为什么要根据属性集闭包找出所有的候选码
  4. 数据库系统原理——数据库建模_函数依赖_72


  5. 候选码的寻找步骤
  6. 数据库系统原理——数据库建模_函数依赖_73

  7. 举例理解
  8. 数据库系统原理——数据库建模_函数依赖_74


  9. 数据库系统原理——数据库建模_实体集_75


3. 正则覆盖

4. 无损连接分解(必须具有)

  1. 无损连接定义
  2. 数据库系统原理——数据库建模_函数依赖_76


  3. 无损连接分解定义
  4. 数据库系统原理——数据库建模_实体集_77


  5. 举例
  6. 数据库系统原理——数据库建模_函数依赖_78


5. 保持依赖分解(可以没有)

  1. 保持依赖定义
  2. 数据库系统原理——数据库建模_实体集_79


  3. 保持依赖分解定义
  4. 数据库系统原理——数据库建模_函数依赖_80


  5. 举例
  6. 数据库系统原理——数据库建模_数据库_81


2.3.6 模式分解算法

定义:一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级的范式

1. 具有函数依赖的数据库设计目标

BCNF、无损连接、保持依赖

但是由于有时不能同时达到这3个目标,不得不在BCNF和3NF中作出选择,而这取决于实际应用需求

2. BCNF分解算法

  1. 定义
  2. 数据库系统原理——数据库建模_函数依赖_82


  3. BCNF分解算法理解
  4. 数据库系统原理——数据库建模_数据库_83


  5. 举例判断关系模式是否为BCNF,不是的话怎么分解
    先分解谁结果可能一样,也可能不一样
  6. 数据库系统原理——数据库建模_数据库_84


  7. 数据库系统原理——数据库建模_函数依赖_85


3. 3NF分解算法

2.3.7 模式求精实例

数据库系统原理——数据库建模_实体集_86


数据库系统原理——数据库建模_实体集_87


数据库系统原理——数据库建模_数据库_88

三. 数据库的设计实例

网上书店