# 数据库
# 基础概念
- 元组:表中的一行就是一个元组。
- 分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。
- 码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。
- 全码:如果一个码包含了所有的属性,这个码就是全码。
- 主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
- 非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
- 外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
- 函数依赖:设R(U)是属性集U上的关系模式。X,Y是U的子集,若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则成X函数确定Y或者Y函数依赖与X, 记作:X→Y。
- 等价:设有两个命题p和q,如果由p作为条件能使得结论q成立,则称p是q的充分条件;若由q能使p成立则称p是q的必要条件;如果p与q能互推(即无论是由q推出p还是p推出q都成立),则称p是q的充分必要条件,简称充要条件,也称p与q等价。
# 关系数据库
# 数据库的结构与模式
数据库的标准结构是三级结构模式。
- 外模式:面向用户与应用程序员的用户级
- 概念模式(模式):面向建立和维护数据库人员的概念级
- 内模式:面向系统程序员的物理级
其中概念模式和内模式只能有一个,而外模式可以有多个。因为我们在存储数据时,模式是只能以一种结构存储,例如创建学生表。内模式 对应我们存储的路径、存储方式、索引方式,所以只能有一种。而外模式对应的是视图,视图是针对基本表而言的,也可以叫虚表,它是抽象出来的 数据集,可以针对不同的业务生成不同种类的数据集。
# 两级映像
- 外模式/模式映象
- 模式/内模式映像
一个模式对应多个外模式,每一个外模式对应一个外模式/模式映象,当模式改变时,数据库管理员改变外模式/模式映象而应用程序无需修改,保证 逻辑独立性。
一个模式对应一个内模式,当内模式改变时,数据库管理员改变模式/内模式映像无需改变模式,应用程序也无需修改,保证物理独立性。
# 数据模型
是数据库结构的基础。数据模型的三要素是数据结构、数据操作、数据的约束条件。常用的数据模型有概念数据模型、基本数据模型 以及面向对象模型。
# 实体-联系 E-R模型
E-R 数据模型的三个基本概念:实体集、联系集和属性。在用E-R模型设计数据库时,可以避免两个缺陷:数据冗余和不完整。但是,为了更加合理、科学的设计数据库,又出现了规范化。
# 范式
好的关系型数据库设计应减少数据冗余、消除异常,所以关系型数据库数据库设计要遵循一定的规则,这个规则就是范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF) 、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般规范化需要做到满足第三范式。
# 第一范式(1NF)
第一范式要满足数据表中每一个属性都是原子性的,不能是集合、数组等非原子性数据项。简单而言,就是数据不可再分。
# 第二范式(2NF)
第二范式要在第一范式基础上满足实体属性完全依赖主键。旨在消除非主属性对主码的部分函数依赖。
# 第三范式(3NF)
在1NF基础上,任何非主属性不依赖于其它非主属性,在2NF基础上消除传递依赖。
# BC范式(BCNF)
在1NF基础上,任何非主属性不能对主键子集依赖,在3NF基础上消除对主码子集的依赖,即每个表中只有一个候选键。
# 第四范式(4NF)
消除表中的多值依赖。
因为规则越高表越多,增加了查询复杂度,降低了查询性能。因此通常使用第三范式平衡。
# 事务
事务是一系列对数据库更稳更新操作组成的程序执行逻辑单元。 事务有四个特性,简称 ACID:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Duration)
图片摘自网络
# 原子性(Atomicity)
原子性,代表着事务的执行必须是一个最小的执行单元,必须满足:
- 全部执行成功
- 全部执行失败
事务中的操作全部成功,事务才能执行成功。
# 一致性(Consistency)
一致性可以理解为数据上的守恒。不能因为 A => B B发生了变化而 A 没有变化。
# 隔离性 (Isolation)
事务与事务之间各自具有完整的数据空间,相互不影响。
# 隔离性级别
- 读未提及(READ_UNCOMMITTED)
- 读已提交(READ_COMMITTED)
- 可重复读(REPEATABLE_READ)
- 顺序读(SERIALIZABLE)
# 持久性(Duration)
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。 只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
# 并发控制
事务的并发控制的方式主要是封锁。
- 排他锁 X
- 共享锁 S
# 数据库的备份与恢复
数据的转储分为静态转储、动态转储、海量转储和增量转储。数据库的四类故障是事务故障、系统故障、介质故障和计算机病毒。
# 事务故障
撤销事务(UNDO)、重做事务(UNDO)。
# 介质故障
需要数据库管理员装入数据库副本和日记文件副本,再由系统进行撤销和重做。
# 关系数据库设计
# 数据库设计方法
数据库设计方法分为四类:直观设计法、规范设计法、计算机辅助设计法、自动化设计法。
# 数据库设计流程
数据库设计分为需求分析、概念结构分析、逻辑结构设计、物理结构设计、应用程序设计和运行维护 6 个阶段。
# 需求分析
对现实世界需要处理的对象及业务进行分析处理,使用数据流图(DFD)生成图像化描述,并使用规范表格进行描述,最后生成需求说明书。
# 概念结构分析
概念结构分析也被称作建模,最常用的方式是 E-R 模型设计。
# 逻辑结构设计
逻辑结构设计主要任务是确定数据模型,将 E-R 图转化为制定数据模型,确定完整性约束,确定用户视图。
# 物理结构设计
数据库在物理设备上的存储结构及存取方法被称为数据库的物理结构。数据库的物理结构设计是利用 DBMS 提供的方法,以较优的存储结构和存取路径 、合理的数据存放位置及存储分配,设计出高效可实现的数据库的物理结构。
# 数据库应用程序设计
数据库应用程序设计是 DBMS 的二次开发。开发人员使用开发语言 (主要是SQL)来进行开发。
# 运行维护
数据库转储和恢复,安全性完整性控制,性能监督、分析改造,数据库的重组和重构等。
# 完整性约束
存储在数据库中的所有数据值均正确的状态。防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息。
- 实体完整性(实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有
- 参照完整性(参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指 关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实 现,还可以用触发器来维护参考完整性)
- 用户定义的完整性。
# 数据库数学逻辑计算
# 闭包
设X和Y均为关系R的属性集的子集,F是R上的函数依赖集,若对R的任一属性集B,一旦X→B,必有B⊆Y,且对R的任一满足以上条件的属性集Y1 , 必有Y⊆Y1,此时称Y为属性集X在函数依赖集F下的闭包,记作x+。
TIP
反复读了几遍之后,觉得定义还是最准确的,最好不要用其他的方式代入理解。
然后怎么求闭包呢?
设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C},计算(AE)+
(1) 令X={AE},X(0)=AE
(2) 分别寻找 A 、E 的推导。 A→D, E→C;所以 X(1) = X(0)DC = ACDE,X(1)≠X(0),同时可以标记 A→D, E→C 不可重复用。
(3) 寻找非 A 、E 使用过的推导,并且是 X(1) 的子集。 CD→I;所以 X(2) = X(1)I = ACDEI 函数依赖中已没有 X(2) 的子集,计算结束。
(AE)+ = ACDEI
# 候选码
对于给定的关系R(A1,A2,…An)和函数依赖集F,可将其属性分为4类:
- L类 仅出现在函数依赖左部的属性。
- R 类 仅出现在函数依赖右部的属性。
- N 类 在函数依赖左右两边均未出现的属性。
- LR类 在函数依赖左右两边均出现的属性。
TIP
- 定理:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任何候选码的成员。
- 推论:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性;则X必为R的唯一候选码。
- 定理:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。
- 定理:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是N类属性,则X必为R的任何候选码的成员。
- 推论:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类和N类组成的属性集,且X+包含了R的全部属性;则X是R的唯一候选码。
# 候选键
可能成为候选键的有 L 类,LR 类和 N 类。
# 最小函数依赖
如果函数依赖集F满足下列条件,则称F为最小函数依赖集或最小覆盖。
- F中的任何一个函数依赖的右部仅含有一个属性;
- F中不存在这样一个函数依赖X→A,使得F与F-{X→A}等价;
- F中不存在这样一个函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
# 去掉函数依赖步骤
- 用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
- 去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
- 去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A属于(X)+,则Y是多余属性,可以去掉。
具体操作:若左侧为 AB ,右侧为 CD ,则可分解为 AB→C , AB→D;去掉其中的一个依赖 AB→C ,然后计算 AB 的闭包 Y,看 Y 是否包含 C,如果包含,AB→C 就是多余依赖;最后判断是否含有左侧依赖。
TIP
业余时间可以了解离散数学,最近篇幅大都与离散数学相关。F-{X→A} 代表两集合相减,属于 F 不属于 {X→A} 的部分。