数据库设计
# 0x1.数据库设计
数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。
目标:为用户和各种应用系统提供一个信息基础设施和高效率的运行环境
数据库建设的基本规律
三分技术,七分管理,十二分基础数据
管理
数据库建设项目管理
企业(即应用部门)的业务管理
基础数据
收集、入库
更新新的数据
结构(数据)设计和行为(处理)设计相结合
将数据库结构设计和数据处理设计密切结合
# 0x2.结构和行为分离的设计
# 0x3.数据库设计基本步骤
# ==0.数据库设计分6个阶段==
- 需求分析
- 概念结构设计
- 逻辑结构设计
- 物理结构设计
- 数据库实施
- 数据库运行和维护
需求分析和概念设计独立于任何数据库管理系统 逻辑设计和物理设计与选用的DBMS密切相关
选定参加设计的人:
1.系统分析人员、数据库设计人员 自始至终参与数据库设计 其水平决定数据库系统的质量
2.用户和数据库管理员 主要参加需求分析和数据库的运行维护 至关重要
3.应用开发人员(程序员和操作员) 在系统实施阶段参与进来,负责编制程序和准备软硬件环境
# 1.需求分析阶段
准确了解与分析用户需求(包括数据与处理)
最困难、最耗费时间的一步
# 1-2.需求分析的方法:
结构化分析方法(Structured Analysis,简称SA方法) 从最上层的系统组织机构入手 自顶向下、逐层分解分析系统
1.首先把任何一个系统都抽象为:
2.分解处理功能和数据 (1)分解处理功能 将处理功能的具体内容分解为若干子功能 (2)分解数据 处理功能逐步分解同时,逐级分解所用数据,形成若干层次的数据流图 (3)表达方法 处理逻辑:用判定表或判定树来描述 数据:用数据字典来描述 3.将分析结果再次提交给用户,征得用户的认可
# 1-3.数据字典
数据字典的用途 进行详细的数据收集和数据分析所获得的主要结果
数据字典的内容
- 数据项
- 数据结构
- 数据流
- 数据存储
- 处理过程
数据项是不可再分的数据单位
对数据项的描述
数据项描述={ 数据项名,数据项含义说明,别名,
数据类型,长度,取值范围,取值含义,
与其他数据项的逻辑关系,数据项之间的 联系 }
2
3
4
5
数据结构反映了数据之间的组合关系。
一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。
对数据结构的描述
数据结构描述={数据结构名,含义说明,
组成:{数据项或数据结构}}
数据流是数据结构在系统内传输的路径。
对数据流的描述
2
3
4
5
6
7
8
数据流描述={ 数据流名,说明,数据流来源,
数据流去向,组成:{数据结构},
平均流量,高峰期流量}
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。
对数据存储的描述
数据存储描述={数据存储名,说明,编号,
输入的数据流 ,输出的数据流 ,
组成:{数据结构},数据量,存取频度, 存取方式}
2
3
4
5
6
7
具体处理逻辑一般用判定表或判定树来描述
处理过程说明性信息的描述
处理过程描述={处理过程名,说明,输入:{数据流},
输出:{数据流},处理:{简要说明}}
2
3
4
5
例子:
例:学生学籍管理子系统的数据字典。
数据项,以“学号”为例:
数据项: 学号
含义说明:唯一标识每个学生
别名: 学生编号
类型: 字符型
长度: 8
取值范围:00000000至99999999
取值含义:前两位标别该学生所在年级,后六位按顺序编号
与其他数据项的逻辑关系:
# 2.概念结构设计阶段
整个数据库设计的关键 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型
# 2-1.概念模型
什么是概念结构设计 将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计 概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定 概念结构设计是整个数据库设计的关键
# ==2-2.ER模型==
# (1)实体型之间关系
用图形来表示两个实体型之间的这三类联系
一对一联系(1:1) 实例 一个班级只有一个正班长 一个班长只在一个班中任职 定义: 如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系,记为1:1
一对多联系(1:n) 实例 一个班级中有若干名学生, 每个学生只在一个班级中学习 定义: 如果对于实体集A中的每一个实体,实体集B中 有n个实体(n≥0)与之联系,反之,对于实体 集B中的每一个实体,实体集A中至多只有一个 实体与之联系,则称实体集A与实体集B有一对 多联系,记为1:n
多对多联系(m:n) 实例 课程与学生之间的联系: 一门课程同时有若干个学生选修 一个学生可以同时选修多门课程 定义: 如果对于实体集A中的每一个实体,实体集B中 有n个实体(n≥0)与之联系,反之,对于实 体集B中的每一个实体,实体集A中也有m个实 体(m≥0)与之联系,则称实体集A与实体B 具有多对多联系,记为m:n
两个以上实体型之间一对多联系 若实体型集E1,E2,...,En存在联系,对于实体集Ej(j=1,2,...,i-1,i+1,...,n)中的给定实体,最多只和Ei中的一个实体相联系,则我们说Ei与E1,E2,...,Ei-1,Ei+1,...,En之间的联系是一对多的:
实例 课程、教师与参考书三个实体型 一门课程可以有若干个教师讲授, 使用若干本参考书, 每一个教师只讲授一门课程, 每一本参考书只供一门课程使用
类比,可以有两个以上实体型间的多对多联系:
实例 供应商、项目、零件三个实体型 一个供应商可以供给多个项目多种零件 每个项目可以使用多个供应商供应的零件每种零件可由不同供应商供给
多个实体型间,若各个实体型两两间都是1:1,则多个实体型间是一对一联系。 多个实体型间,若各个实体型两两间都是m:n,则多个实体型间是多对多联系。 否则,则只要有一个实体型与其它实体型中的任何一个存在1:n,则多个实体型间是一对多联系
# (2)实体内部关系
实体内部的一对多联系:
实例 职工实体型内部具有领导与被领导的联系 某一职工(干部)“领导”若干名职工 一个职工仅被另外一个职工直接领导 这是一对多的联系
多对多联系:
# (3)自底向上设计
首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构。
自底向上策略:
# (4)常用策略
自顶向下地进行需求分析 自底向上地设计概念结构
例子:
用E-R图表示某个工厂物资管理的概念模型
实体 仓库: 仓库号、面积、电话号码 零件 :零件号、名称、规格、单价、描述 供应商:供应商号、姓名、地址、电话号码、帐号 项目:项目号、预算、开工日期 职工:职工号、姓名、年龄、职称
实体之间的联系如下: (1)一个仓库可以存放多种零件,一种零件可以存放在多个仓库中。仓库和零件具有多对多的联系。用库存量来表示某种零件在某个仓库中的数量。 (2)一个仓库有多个职工当仓库保管员,一个职工只能在一个仓库工作,仓库和职工之间是一对多的联系。职工实体型中具有一对多的联系 (3)职工之间具有领导-被领导关系。即仓库主任领导若干保管员。 (4)供应商、项目和零件三者之间具有多对多的联系
# 2-3.概念结构设计
# (1)数据抽象
抽象是对实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述。 概念结构是对现实世界的一种抽象
三种常用抽象
- 分类(Classification) 定义某一类概念作为现实世界中一组对象的类型 抽象了对象值和型之间的“is member of”的语义
- 聚集(Aggregation) 定义某一类型的组成成分 抽象了对象内部类型和成分之间“is part of”的语义
复杂的聚集,某一类型的成分仍是一个聚集
- 概括(Generalization) 定义类型之间的一种子集联系 抽象了类型之间的“is subset of”的语义 继承性
# (2)实体与属性的划分原则
两条准则: (1)属性不能再具有需要描述的性质。即属性必须是不可分的数据项,不能再由另一些属性组成 (2)属性不能与其他实体具有联系。联系只发生在实体之间
# (3)逐一设计分E-R图
在多层的数据流图中选择一个适当层次的数据流图,作为设计分E-R图的出发点 通常以中层数据流图作为设计分E-R图的依据,如下,将职称作为一个实体:
病房作为一个实体:
# (4)E-R图的集成
各个局部视图即分E-R图建立好后,还需要对它们进行合并,集成为一个整体的数据概念结构即总E-R图。
视图集成的两种方式:
多个分E-R图一次集成 一次集成多个分E-R图 通常用于局部视图比较简单时
逐步集成 用累加的方式一次集成两个分E-R图
集成局部E-R图的步骤
合并 解决冲突
修改与重构 消除冗余
视图的集成:
# 1.消除冲突
冲突的种类:
属性冲突
两类属性冲突
属性域冲突
属性值的类型
取值范围
取值集合不同
属性取值单位冲突
命名冲突
两类命名冲突
同名异义:不同意义的对象在不同的局部应用中具有相同的名字
异名同义(一义多名):同一意义的对象在不同的局部应用中具有不同的名字
结构冲突
- 同一对象在不同应用中具有不同的抽象
- 同一实体在不同分E-R图中所包含的属性个数和属性排列次序不完全相同
- 实体之间的联系在不同局部视图中呈现不同的类型
# 2.消除冗余
消除不必要的冗余,设计生成基本E-R图
冗余的数据是指可由基本数据导出的数据 冗余的联系是指可由其他联系导出的联系
冗余数据和冗余联系容易破坏数据库的完整性,给数据库维护增加困难
消除不必要的冗余后的初步E-R图称为基本E-R图
分析方法 以数据字典和数据流图为依据 根据数据字典中关于数据项之间的逻辑关系
效率VS冗余信息 需要根据用户的整体需求来确定 若人为地保留了一些冗余数据,则应把数据字典中数据关联的说明作为完整性约束条件 Q4=∑Q5 一旦Q5修改后就应当触发完整性检查,对Q4进行修改
规范化理论 函数依赖的概念提供了消除冗余联系的形式化工具
消除方法:
确定分E-R图实体之间的数据依赖 ,并用实体码之间的函数依赖表示。
劳动人事管理的分E-R图 :
上图中, 部门和职工之间一对多的联系可表示为: 职工号→部门号 职工和产品之间多对多的联系可表示为: (职工号,产品号)→工作天数 得到函数依赖集F~L~
求FL的最小覆盖GL ,差集为D = FL-GL。 逐一考察D中的函数依赖,确定是否是冗余的联系,若是,就把它去掉。
(1) 冗余的联系一定在D中,而D中的联系不一定是冗余的; (2) 当实体之间存在多种联系时要将实体之间的联系在形式上加以区分。 图7.27
# (5)验证整体概念结构
视图集成后形成一个整体的数据库概念结构,对该整体概念结构还必须进行进一步验证,确保它能够满足下列条件: 整体概念结构内部==必须具有一致性==,不存在互相矛盾的表达 整体概念结构能==准确地反映原来的每个视图结构==,包括==属性==、==实体==及==实体==间的==联系== 整体概念结构能==满足需要分析阶段所确定的所有要求==
# (6)归总
概念结构设计的步骤 抽象数据并设计局部视图 集成局部视图,得到全局概念结构 验证整体概念结构
# 3.逻辑结构设计阶段
将概念结构转换为某个DBMS所支持的数据模型对其进行优化。
逻辑结构设计的任务:
把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品==所支持的数据模型相符合==的逻辑结构
逻辑结构设计的步骤:
将概念结构转化为一般的关系、网状、层次模型 将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换 对数据模型进行==优化==
# 3-1.E-R图向关系模型的转换
E-R图向关系模型的转换要解决的问题 如何将实体型和实体间的联系转换为关系模式 如何确定这些关系模式的属性和码 转换内容 将E-R图转换为关系模型:将实体、实体的属性和实体之间的联系转换为关系模式。
转换方式:
实体型间的联系有以下不同情况 : (1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
- 转换为一个独立的关系模式
- 与某一端实体对应的关系模式合并
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。 转换为一个独立的关系模式,与n端对应的关系模式合并(即将1作为n的一个属性) (3) 一个m:n联系转换为一个关系模式。 例,“选修”联系是一个m:n联系,可以将它转换为如下关系模式,其中学号与课程号为关系的组合码: 选修(学号,课程号,成绩) (4)三个或三个以上实体间的一个多元联系转换为一个关系模式。 例,“讲授”联系是一个三元联系,可以将它转换为如下关系模式,其中课程号、职工号和书号为关系的组合码: 讲授(课程号,职工号,书号) (5)具有相同码的关系模式可合并 目的:减少系统中的关系个数 合并方法:将其中一个关系模式的全部属性加入到另一个关系模式中,然后去掉其中的同义属性(可能同名也可能不同名),并适当调整属性的次序
注意: 从理论上讲,1:1联系可以与任意一端对应的关系模式合并 但在一些情况下,与不同的关系模式合并效率会大不一样。因此究竟应该与哪端的关系模式合并需要依应用的具体情况而定。 由于连接操作是最费时的操作,所以==一般应以尽量减少连接操作为目标==。 例如,如果经常要查询某个班级的班主任姓名,则将管理联系与教师关系合并更好些。
例子:
答案是至少7张表:==每个实体一张表(5),多对多的两个关系分别一张表(2)==,如下:
- 部门实体对应的关系模式 部门(部门号,部门名,经理的职工号,…) 此关系模式已包含了联系“领导”所对应的关系模式 经理的职工号是关系的候选码
- 职工实体对应的关系模式 职工(职工号、部门号,职工名,职务,…) 该关系模式已包含了联系“属于”所对应的关系模式
- 产品实体对应的关系模式 产品(产品号,产品名,产品组长的职工号,…)
- 供应商实体对应的关系模式 供应商(供应商号,姓名,…)
- 零件实体对应的关系模式 零件(零件号,零件名,…)
- 联系“参加”所对应的关系模式 职工工作(职工号,产品号,工作天数,…)
- 联系“供应”所对应的关系模式 供应(产品号,供应商号,零件号,供应量)
# 3-2.数据模型的优化
得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化 关系数据模型的优化通常以规范化理论为指导
优化数据模型的方法步骤:
- 确定数据依赖 按需求分析阶段所得到的语义,分别写出每个关系模式内部各属性之间的数据依赖以及不同关系模式属性之间数据依赖
- 消除冗余的联系 对于各个关系模式之间的数据依赖进行极小化处理,消除 冗余的联系。
- 确定所属范式
- 按照数据依赖的理论对关系模式逐一进行分析
- 考查是否存在部分函数依赖、传递函数依赖、多值依赖等
- 确定各关系模式分别属于第几范式
- 按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
注意:并不是规范化程度越高的关系就越优,一般说来,==第三范式就足够了==
常用的分解方法:
- 水平分解
- 垂直分解
水平分解
- 什么是水平分解
- 把(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率
- 水平分解的适用范围
- 满足“80/20原则”的应用
- 并发事务经常存取不相交的数据(n个事务可分解为小于等于n个子关系)
垂直分解
- 什么是垂直分解
- 把关系模式R的属性分解为若干子集合,形成若干子关系模式
- 垂直分解的适用范围
- 经常被使用的属性组成一个子关系,可以提高某些事务效率也可能降低另一些事务的效率
- 取决于分解后R上的所有事务的总效率是否得到了提高
# 3-3设计用户子模式
定义用户外模式时应该注重的问题 包括三个方面: (1) 使用更符合用户习惯的别名 (2) 针对不同级别的用户定义不同的View ,以满足系统对安全性的要求。 (3) 简化用户对系统的使用 (预先为常用复杂查询定义视图)
# 4.数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法索引)
# 4-1.数据库物理设计的内容和方法
数据库的物理设计 数据库在==物理设备上的存储结构与存取方法==称为数据库的物理结构,它==依赖于选定的数据库管理系统== 为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计
数据库物理设计的步骤 确定数据库的物理结构,在关系数据库中主要指==存取方法和存储结构== 对物理结构进行评价,评价的重点是==时间和空间效率== 如果评价结果满足原设计要求,则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型
设计物理数据库结构的准备工作 ==对要运行的事务进行详细分析==,获得选择物理数据库设计所需参数 ==充分了解所用RDBMS的内部特征==,特别是系统提供的存取方法和存储结构
# 4-2.关系模式存取方法选择
关系模式存取方法选择:
数据库系统是多用户共享的系统,对同一个关系要建立==多条存取路径==才能满足多用户的多种应用要求 物理设计的任务之一就是要确定选择哪些存取方法,即==建立哪些存取路径==
DBMS常用存取方法
索引方法
- 目前主要是B+树索引方法
- 经典存取方法,使用最普遍
聚簇(Cluster)方法
HASH方法
怎样建立索引:
根据应用要求确定 对哪些属性列建立索引 对哪些属性列建立组合索引 对哪些索引要设计为唯一索引
选择HASH存取方法的规则 当一个关系的属性主要出现在等值连接条件中或主要出现在相等比较选择条件中,且满足下列两个条件之一时,可以选择HASH存取方法 该关系的大小可预知,而且不变; 该关系的大小动态改变,但所选用的DBMS提供了动态HASH存取方法
聚簇 为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇 聚簇的用途
- 大大提高按聚簇码进行查询的效率
- 节省存储空间 聚簇以后,聚簇码相同的元组集中在一起了,因而聚簇码值不必在每个元组中重复存储,只要在一组中存一次就行了
聚簇的局限性
- 聚簇只能提高某些特定应用的性能
- 建立与维护聚簇的开销相当大 对已有关系建立聚簇,将导致关系中元组移动其物理存储位置,并使此关系上原有的索引无效,必须重建 当一个元组的聚簇码改变时,该元组的存储位置也要做相应移动
聚簇的适用范围
- 既适用于单个关系独立聚簇,也适用于多个关系组合聚簇 例:假设用户经常要按系别查询学生成绩单,这一查询涉及学生关系和选修关系的连接操作,即需要按学号连接这两个关系,为提高连接操作的效率,可以把具有相同学号值的学生元组和选修元组在物理上聚簇在一起。这就相当于把多个关系按“预连接”的形式存放,从而大大提高连接操作的效率。
- 当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的时,可以使用聚簇。 尤其当SQL语句中包含有与聚簇码有关的ORDER BY,GROUP BY,UNION,DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作.
设计候选聚簇 对经常在一起进行连接操作的关系可以建立聚簇 如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇 如果一个关系的一个(或一组)属性上的值重复率很高,则此单个关系可建立聚簇。即对应每个聚簇码值的平均元组数不太少。太少了,聚簇的效果不明显
优化聚簇设计 从聚簇中删除经常进行全表扫描的关系; 从聚簇中删除更新操作远多于连接操作的关系; 不同的聚簇中可能包含相同的关系,==一个关系可以在某一个聚簇中,但不能同时加入多个聚簇== 从这多个聚簇方案(包括不建立聚簇)中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小
# 4-3.确定数据库的存储结构
确定数据的存放位置和存储结构(稳定、经常存取、存取频率较低) 关系 索引 聚簇 日志 备份
确定系统配置
确定数据存放位置和存储结构的因素 存取时间 存储空间利用率 维护代价 这三个方面常常是相互矛盾的 例:消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加 必须进行权衡,选择一个折中方案
基本原则 根据应用情况将
- ==易变部分==与==稳定部分==分开存放
- ==存取频率较高部分==与==存取频率较低部分==,分开存放
# 5.数据库实施阶段
运用DBMS提供的数据库语言(如SQL)及宿主语言,根据逻辑设计和物理设计的结果 建立数据库 编制与调试应用程序 组织数据入库 进行试运行
7.6.1 数据的载入和应用程序的调试 7.6.2 数据库的试运行 7.6.3 数据库的运行和维护
试运行阶段:
在原有系统的数据有一小部分已输入数据库后,就可以开始对数据库系统进行联合调试,称为数据库的试运行 数据库试运行主要工作包括: 1)功能测试 实际运行数据库应用程序,执行对数据库的各种操作,测试应用程序的功能是否满足设计要求 如果不满足,对应用程序部分则要修改、调整,直到达到设计要求 2)性能测试 测量系统的性能指标,分析是否达到设计目标 如果测试的结果与设计目标不符,则要返回物理设计阶段,重新调整物理结构,修改系统参数,某些情况下甚至要返回逻辑设计阶段,修改逻辑结构
强调两点: ==分期分批组织数据入库== 重新设计物理结构甚至逻辑结构,会导致数据重新入库。 由于数据入库工作量实在太大,费时、费力,所以应分期分批地组织数据入库 先输入小批量数据供调试用 待试运行基本合格后再大批量输入数据 逐步增加数据量,逐步完成运行评价
==数据库的转储和恢复== 在数据库试运行阶段,系统还不稳定,硬、软件故障随时都可能发生 系统的操作人员对新系统还不熟悉,误操作也不可避免 因此必须做好数据库的转储和恢复工作,尽量减少对数据库的破坏。
# 6.数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行 在数据库系统运行过程中必须不断地对其进行评价、调整与修改
在数据库运行阶段,对数据库经常性的维护工作主要是由DBA(数据库管理员)完成的,包括: 数据库的转储和恢复 数据库的安全性、完整性控制 数据库性能的监督、分析和改进 数据库的重组织和重构造
数据库的重组织和重构造
- 重组织的形式
- 全部重组织
- 部分重组织 只对频繁增、删的表进行重组织
- 重组织的目标 提高系统性能
- 重组织的工作
- 按原设计要求 重新安排存储位置 回收垃圾 减少指针链
- 数据库的重组织不会改变原设计的数据逻辑结构和物理结构
数据库重构造 根据新环境调整数据库的模式和内模式 增加新的数据项 改变数据项的类型 改变数据库的容量 增加或删除索引 修改完整性约束条件
# 0x4.数据库设计过程中的各级模式
数据库设计不同阶段形成的数据库各级模式