设计
对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求(存储和管理哪些数据对象)和数据操作要求(对数据对象需要进行哪些操作)
目标是为用户和各种应用系统提供一个信息基础设施和高效率的运行环境(数据存取效率高, 存储空间利用率高, 系统运行管理的效率高).
结构(数据)设计和行为(操作)设计相结合.
设计方法:
- 手工试凑法
- 规范设计法(结构化方法)
- 新奥尔良方法
- 基于E-R模型的数据库设计方法
- 3NF的设计方法
- 面向对象的数据库设计方法
- 统一建模语言(UML)方法
基本步骤:

- 需求分析: 综合各个用户的应用需求
- 概念结构设计: 形成独立于机器特点,独立于各个数据库管理系统产品的概念模式(E-R图)
- 逻辑结构设计: 首先将E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式, 然后根据用户处理的要求、安全性的考虑,在基本表的基础上再建立必要的视图(View),形成数据的外模式
- 物理结构设计: 根据数据库管理系统特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式
- 数据库实施
- 数据库运行和维护
需求分析
不关注
注意E-R图绘制, 考察基本E-R图, 拓展E-R不考
数据字典(和DBMS中的数据字典不同)是关于数据库中数据的描述,即元数据,不是数据本身. 数据字典在需求分析阶段建立, 在设计过程中不断修改充实完善. 数据字典是进行详细的数据收集和数据分析所获得的主要结果. 内容包括数据项(数据的最小组成单位), 数据结构(由若干数据项/数据结构组成), 数据流(数据结构在系统内传输的路径), 数据存储(数据结构停留或保存的地方, 是数据流的来源和去向之一), 处理过程.
考虑到可能的扩充和改变, 强调用户的参与
概念结构设计
将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程.
形成独立于机器特点,独立于各个数据库管理系统产品的概念模式(E-R图)
知道就行, 如何拆分和合并图, 不做重点考查
设计方法
- 自顶向下, 首先定义全局概念结构框架, 再逐步细化.
- 逐步扩张, 首先定义核心概念结构, 然后向外滚雪球扩充.
- 混合策略: 自顶向下设计全局概念结构框架, 自底向上设计各局部概念结构
自底向上: 先进行局部视图设计, 画出分E-R图, 再集成为总E-R图得到全局概念结构.
实体和属性的划分准则:
- 能作为属性的尽量作为属性对待
- 作为属性必须不可分, 不能再具有需要描述的性质, 不能包含其他属性
- 属性不能和其他实体具有联系, 只能属于某一实体或联系
E-R图
- 矩形 → 实体型
- 菱形 → 联系
- 椭圆形 → 实体型或联系的属性
- 三角形 → 表示”is a”联系, 表示子类继承父类的所有属性
联系
实体型之间的三类联系(体现实体之间的数量关系)

两个以上的实体型之间也可以存在联系:

同一实体集内的各个实体之间也可以存在联系:

有几个实体型参与, 就叫几元联系.
联系也可以具有属性:

继承
分类属性是父实体型的一个属性, 将父实体型中的实体分派到子实体型中.

三角形中是否加叉号表示父类的一个实体能否同时属于多个子实体型. 加上则为不相交约束, 不加则为可重叠约束.
完全特化: 父类中的一个实体必须是某一个子类中的实体, 用父类到子类的双线连接.
部分特化: 父类中的一个实体可以不是某一个子类中的实体, 用父类到子类的单线连接.

基数约束
说明联系中实体型能够出现的最少/最多次数, 是对一对一/一对多/多对多联系的细化, 用一个数对
min...max
表示. *
代表无穷大. 
min = 1 → 强制参与约束
min = 0 → 非强制参与约束
Part-of联系
描述某个实体型是另一个实体型的一部分.
非独占的Part-of联系(非独占联系): 整体实体如果被破坏, 另一部分实体仍然可以独立存在, 用非强制参与联系表示.

独占的Part-of联系: 整体实体如果被破坏, 不分实体不能存在, 用弱实体类型和识别联系表示.
弱实体型: 依赖于其他实体型的存在而存在的实体型(相对: 强实体型), 用双矩形表示. 识别联系用双菱形表示.

E-R图的集成
- 合并: 解决分E-R图之间的冲突, 将分E-R图合并起来生成初步E-R图;
- 冲突:
- 属性冲突: 属性值的类型, 取值范围, 取值集合或取值单位不同
- 命名冲突: 同名异义, 异名同义, 可能发生在实体、联系一级也可能发生在属性一级
- 结构冲突: 同一对象在不同应用中具有不同的抽象(一个图中是实体, 另一个图中是属性, 需要统一)/同一实体在不同子系统中包含的属性个数和排列次序不同(取并集, 调整次序)/在不同E-R图中具有不同类型的联系(综合调整)
- 修改和重构: 消除初步E-R图中不必要的冗余, 生成基本E-R图;
- 冗余的数据(可由基本数据导出的数据), 冗余的联系(可由其他联系导出的联系)
- 主要采用分析方法, 以数据字典和数据流图为依据, 根据数据字典中关于数据项之间逻辑关系的说明消除冗余
- 规范化理论消除冗余
- 最小覆盖(Minimal Cover) 是指一个函数依赖集合,它具有以下三个性质:
- 右侧都是单个属性(如果不是,可以通过分解得到)。
- 没有冗余的函数依赖(即移除任何一个FD都会改变闭包)。
- 没有冗余的左侧属性(即在任何一个FD中,左侧的属性都不能被移除而不改变闭包)。
- 求FL的最小覆盖GL 的过程通常涉及以下步骤:
- 分解右侧非单属性的FD:如果一个FD的右侧包含多个属性,将其分解为多个右侧为单属性的FD。例如,
A -> BC
可以分解为A -> B
和A -> C
。 - 移除冗余的FD:对于FL中的每个FD,尝试移除它,然后检查剩余FD的闭包是否仍然能推导出被移除的FD。如果能,则该FD是冗余的,可以移除。
- 移除左侧冗余属性:对于FL中的每个FD
X -> A
,检查X中的每个属性x
,如果X - {x} -> A
仍然成立,则x
是冗余的,可以从X中移除。 - 通过以上步骤,我们得到一个精简的函数依赖集合 GL,它与原始的FL具有相同的推导能力,但去除了内部的冗余。
- 差集 D = FL - GL:这个差集D包含了在FL中存在,但在GL中被移除的函数依赖。这些被移除的FD就是潜在的冗余联系。它们之所以被移除,是因为它们可以从GL中的其他函数依赖推导出来,因此在数据库设计中是多余的。
- 冗余的联系一定在D中, 但是D中的联系不一定是冗余的.
- 考察过程:对于D中的每一个函数依赖
X -> Y
,你需要检查E-R图中是否存在一个直接对应于这个FD的联系。 - 如果存在这样的联系,并且该联系所表达的信息可以通过E-R图中现有的其他实体和联系(这些联系对应于GL中的函数依赖)间接推导出来,那么这个联系就是冗余的。
- 例如,如果FL中包含
(学生ID, 课程号) -> 教师ID
(表示学生选修某门课程,由固定教师教授),而GL中已经有课程号 -> 教师ID
(表示一门课程只由一个教师教授)。那么,FL中的第一个FD就是冗余的,因为它可以通过第二个FD推导出来。此时,如果E-R图中有一个“学生-选课-教师”的三元联系,这个联系可能就是冗余的,因为教师信息可以直接通过“课程”实体获得。 - 删除冗余联系:一旦确定某个联系是冗余的,就可以将其从E-R图中移除。
1. 确定E-R图实体之间的数据依赖
在E-R图中,实体之间的联系(Relationship)实际上体现了数据依赖。第一步是识别并列出所有实体之间的函数依赖.
将E-R图中所有实体属性之间的确定性关系都以函数依赖的形式表示出来,构成一个函数依赖集合FL。这个FL是后续步骤的基础。
2. 求FL的最小覆盖GL,差集为 D = FL - GL
这一步是规范化理论的核心应用。
3. 逐一考察D中的函数依赖,确定是否是冗余的联系,若是,就把它去掉。
现在我们有了潜在的冗余函数依赖集合D。这一步是根据D中的每个函数依赖,回到E-R图中,判断其对应的联系是否真的是冗余的,并将其删除。
- 迭代.
逻辑结构设计
基本E-R图 → 逻辑结构(i.e. 关系模式的集合)
逻辑结构设计转换原则要会做, E-R图转成表
将E-R图转换为关系模型: 将实体型、实体的属性和实体型之间的联系转化为关系模式
转换原则:
- 一个实体型 → 一个关系模式
- 实体的属性变成关系的属性, 实体的码变为关系的码
- 一个1:1的二元联系 → 一个独立的关系模式 / 与任意一端对应的关系模式合并
- 转换为一个独立的关系模式: 与该联系相连的各实体的码以及联系本身的属性变成关系的属性, 每个实体的码均是该关系的候选码
- 与某一端实体对应的关系模式合并: 该端关系的码和联系本身的属性组成合并后关系的属性, 合并后关系的码保持不变
- 一个1:n的二元联系 → 一个独立的关系模式 / 与n端对应的关系模式合并
- 转换为一个独立的关系模式: 与该联系相连的各实体的码以及联系本身的属性变成关系的属性, n端实体的码成为该关系的候选码
- 与n端实体对应的关系模式合并: 1端关系的码(成为外码)和联系本身的属性组成合并后关系的属性, 合并后关系的码保持不变(仍为n端关系的码). 可以减少系统中的关系个数.
- 一个m:n的二元联系 → 一个独立的关系模式
- 与该联系相连的各实体的码以及联系本身的属性组成新关系的属性
- 各实体的码组合成新关系模式的码
- 多元联系 → 一个独立的关系模式
- 与该多元联系相连的各实体的码以及该联系本身的属性组成新关系的属性
- 各实体码组合成新关系模式的码
- 关系模式合并 → 从以上步骤派生出的具有相同码的关系模式可以合并
- 将其中一个关系模式的全部属性加入另一个关系模式中
- 去掉同义属性, 适当调整次序
转换完毕之后得到初步数据模型, 还可以用规范化理论优化(分析数据依赖, 消除冗余, 分解以符合范式/合并以方便使用).
模式分解
有利有弊, 什么场景适合/不适合要知道
答题时若要求举例一定要写出例子
“教务系统什么时候水平拆分, 什么时候垂直拆分?”
并不是规范化程度越高的关系就越好(连接的代价高, 有时候不分解反而更好, 需要权衡)
当查询经常涉及多个关系模式的属性时, 系统开销会因为连接运算而激增. 在这种情况下低级别范式往往更适合. 非BCNF的关系模式虽然会存在不同程度的更新异常, 但如果在实际应用中对此关系模式只是查询, 并不执行更新操作, 就不会产生实际影响. 具体规范化到什么程度需要权衡响应时间和更新问题.
分解方式: 水平分解/垂直分解
水平分解
把基本关系的元组分为若干子集合, 定义每个子集合为一个子关系, 提高系统效率.
- 对符合80/20原则的, 把20%经常被使用的数据水平分解出来形成一个子关系
- 水平分解为若干子关系, 使得每个事务存取的数据对应一个子关系(类似RAID 0, 提高并发)
垂直分解
把关系模式的属性分解为若干子集(属性组), 形成若干子关系模式
原则: 经常在一起使用的属性从R中分解出来形成一个子关系模式
优点: 可以提高某些事务的效率(如分解范式以避免大量修改同一个数据项等)
缺点: 可能使得另一些事务不得不执行连接操作, 降低了效率
适用范围: 取决于分解之后关系模式上所有事务的总效率是否得到提高
方法: 直观分解/模式分解算法(不能损失关系模式的语义, 必须保证无损连接和函数依赖)
设计用户子模式(外模式)
考虑用户的习惯和方便, 包括三方面:
- 使用更符合用户习惯的别名
- 针对不同级别的用户定义不同的视图, 保证系统安全性
- 简化系统使用
物理结构设计
优化方式, 聚簇存取方法
物理结构: 数据库在物理设备上的存储结构与存取方法.
数据库的物理设计: 为一个给定逻辑结构模型选取一个最适合应用要求的物理结构.
索引和SQL相关, 需要知道
步骤: 确定物理结构(存取方法, 存储结构) → 评价(时间/空间效率)
存取方法
常用存取方法: B+树索引存取方法, Hash索引存取方法, 聚簇存取方法
B+树索引存取方法
索引存取方法的主要内容:
- 对哪些属性列建立索引
- 对哪些属性列建立组合索引
- 将哪些索引设计为唯一索引
选择的主要原则:
- 如果一个/组属性经常在查询条件中出现, 则考虑在这个/组属性上建立B+树索引/组合索引
- 如果一个属性经常作为最大值/最小值等聚集函数作用的对象, 则考虑在这个属性上建立B+树索引
- 如果一个/组属性经常在连接条件中出现, 则考虑在这个/组属性上建立B+树索引
关系上定义过多的索引会带来较多额外开销(维护, 查找)
Hash索引存取方法
选择Hash存取方法的规则: 一个关系的属性主要出现在等值连接条件/等值比较选择条件(
WHERE ... = ...
)中, 而且满足下列两个条件之一:- 该关系的大小可预知而且不变
- 该关系的大小动态改变, 但选用的数据库管理系统提供了动态hash存取方法
聚簇
为了提高某个属性(组)的查询速度, 把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块中. 这样能够大大提高按聚簇属性进行查询的效率(每读一个物理块可以得到多个满足查询条件的元组, 显著减少了访问磁盘的次数)
既适用于单个关系独立聚簇, 也适用于经常进行连接操作的多个关系(可以通过把多个连接的元组按照属性值聚集存放, 从而实现多个关系的预连接, 即频繁连接的元组在磁盘上集中存放, 提高连接操作的效率).
设计过程:
- 选择聚簇存储方法:
- 需要建立多少个聚簇, 每个聚簇中包含哪些关系
- 一个数据库可以建立多个聚簇, 但是一个关系只能加入一个聚簇
- 设计候选聚簇:
- 经常在一起进行连接操作的关系可以建立组合聚簇
- 一个关系的一组属性经常出现在等值比较条件中, 则该单个关系可以建立聚簇
- 一个关系的一个/一组属性上的值重复率很高, 则该单个关系可以建立聚簇
- 检查候选聚簇中的关系
- 从聚簇中删除经常进行全盘扫描的关系
- 从聚簇中删除更新操作远多于连接操作的关系
- 从聚簇中删除重复出现的关系(当一个发现关系重复加入多个候选聚簇时, 必须选择一个最优的)
聚簇的局限性: 只能提高某些特定应用的性能, 且建立和维护的开销很大(新建或每次聚簇码改变都会导致物理存储位置移动, 原有索引失效).
当该关系上的操作主要是通过聚簇码进行访问或连接, 与聚簇码无关的其他访问很少或者次要时, 可以使用聚簇.
尤其当SQL语句中包含与聚簇码有关的
ORDER BY
, GROUP BY
, UNION
, DISTINCT
等子句或短语时, 使用聚簇特别有利, 可以省去或减化对结果集的排序操作. 存储结构
主要指关系, 索引, 聚簇, 日志, 备份等的存储安排和存储结构, 以及系统配置等.
存取时间/存取空间利用率/维护代价 三方面常常相互矛盾, 必须进行权衡折中.
基本原则: 易变部分与稳定部分分开存放, 经常存取部分与存取频率较低部分分开存放
评价方法: 存储空间, 存取时间, 维护代价
实施, 运行, 维护概念
不多考查