目录
基本概念
数据库系统的特点
DBMS的基本功能
DBMS的体系结构
数据库系统结构
数据库的三级模式结构
关系模型
关系模型的组成要素及其优缺点
关系模型的完整性约束条件及违约处理策略
违约处理
关系操作
关系代数
SQL语句
关系数据理论
如何评判数据库设计的好坏?(数据冗余、 操作异常)
1NF、 2NF、 3NF(定义、 判断)
数据依赖的公理系统(Armstrong公理、 最小函数依赖集 )
数据库设计
数据库设计的步骤及各阶段完成的任务
E-R图设计及其到关系模式的转换
E-R 模型向关系模型的转换规则
存储与索引
计算机系统的存储体系及工作原理
定长和变长记录存储方法
索引: 顺序文件、 B+树
索引的创建原则、 创建命令和使用效果
创建原则
RDBMS元数据结构
查询处理与优化
关系查询处理的步骤
查询优化方法(启发式优化准则、 查询树)
事务及其ACID特性
事务( Transaction)
ACID特性
数据库恢复
故障种类及其可能对数据库造成的影响
支持Undo和Redo的日志记录
系统故障的恢复策略
并发控制
可串行化调度的定义
冲突可串行化调度的定义及判断方法
封锁协议及事务隔离程度
数据库(Database):有组织、冗余度小,可共享、数据独立性高、易扩展的数据集合
数据长期存储
数据由DBMS统一管理
数据共享程度高
数据独立性高
数据整体结构化,冗余小
1. 数据库定义:定义外模式、 模式、 内模式、 数据库完整性、 安全保密、 存取路径等
2. 数据存取:提供数据的操纵语言以便对数据进行查找和增删改
3. 数据库运行管理:事务管理、 自动恢复、 并发控制、 死锁检测或防止、 安全性检查、 存取控制、 完整性检查、 日志记录等
4. 数据组织、 存储和管理:数据字典、 用户数据、 存取路径的组织存储和管理, 以便提高存储空间利用率, 并方便存取
5. 数据库的建立和维护:数据转换、 数据库初建、 转储、 恢复、 重组、 重构以及性能检测等
6. 网络通信、 数据转换等
• 事务管理器
– 将关于事务动作的消息传给日志管理器
– 将关于何时可以或必须将缓冲区拷回磁盘的消息传给缓冲区管理器
– 将数据库查询等操作消息传给查询处理器
• 恢复管理器
– 当系统崩溃时, 恢复管理器被激活
– 它检查日志并在必要时利用日志恢复数据
• 日志管理器
– 维护日志, 记录所有对数据库的修改操作
– 必须与缓冲区管理器打交道, 因为对磁盘的访问是通过缓冲区管理器来进行的
• 缓冲区管理器
– 分配、 管理和回收缓冲区
– 决定何时将缓冲区的数据写回磁盘( 立即修改/延迟修改)
外模式(所有用户的公共数据视图)、模式(数据库用户的数据视图,是与某一应用有关的数据的逻辑表示)、内模式(数据物理存储和存储方式的描述)
通过三级模式结构实现了数据独立性
组成要素
数据结构:关系(二维表)
数据操作:查询 / 增 / 删 / 改
完整性约束条件:实体 / 参照 / 用户自定义
优点
关系模型是建立在严格的数学概念的基础上的。
无论实体还是实体之间的联系都用关系来表示。对数据的查询结果也是关系(表),因此概念单一,其数据结构简单、清晰。
关系模型的存取路径对用户透明,从而具有更高的数据独立性,更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
缺点
由于存取路径对用户透明,查询效率往往不如非关系数据模型。因此为了提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统的负担。
实体完整性、参照完整性、用户自定义完整性
1. 实体完整性检查和违约处理
插入元组或修改主码列操作时, DBMS自动检查和处理:
• 主码值是否唯一, 如果不唯一则拒绝操作
• 主码各属性是否为空, 只要有一个为空就拒绝操作
2. 可能破坏参照完整性的情况及违约处理
3. 用户定义的约束条件检查和违约处理
– 插入元组或修改属性的值时, DBMS检查属性上的
约束条件是否被满足
– 如果不满足则操作被拒绝执行
特点
– 运算对象和运算结果均关系
– 关系代数运算符包含集合运算符和专门的关系运算符
– 传统的集合运算是从关系的行的角度进行,专门的关系运算不仅涉及行而且涉及列
专门的关系运算:选择、投影、连接(等值连接、自然连接、外连接)、除运算
DDL:CREATE, DROP, ALTER (定义关系模式、 属性域、 完整性约束、 索引、 视图等)
DML:SELECT, INSERT, UPDATE, DELETE
DCL:GRANT, REVOKE
SELECT
LIKE
% (百分号) 代表任意长度(长度可以为0) 的字符串
_ (下划线) 代表任意单个字符
GROUP BY
1. 分组, 细化聚集函数的作用对象
2. 如果未对查询结果分组, 聚集函数将作用于整个查询结果
3. 对查询结果分组后, 聚集函数将分别作用于每个组
4. 按指定的一列或多列值分组, 值相等的为一组
HAVING短语与WHERE子句的区别
1. 作用对象不同
2. WHERE子句作用于基表或视图, 从中选择满足条件的元组
3. HAVING短语作用于组, 从中选择满足条件的组
grant:加权
outer join
左外连接:以左表为主,所以右表 值为NULL 的存在;同理右外连接 左空
自然连接之后相同的属性只会存在一个
view
create view 视图名 as (select ID, name, dept_name from instructor)
存储过程
存储过程是过程化结构;存储过程一经定义, 即被存储在数据库中;应用程序可调用
触发器
1. 触发器是一条语句, 当对数据库修改时, 它自动被系统执行
2. 触发器模型: 事件—条件—动作模型
3. 触发器一经定义, 将被存储在数据库中
4. 触发器机制有利于警示或满足特定条件时自行执行某项任务
eg1. 将空grade置为null
create trigger setnull_trigger before update of takes
referencing new row as nrow
for each row
when (nrow.grade = ‘ ‘)
begin atomic
set nrow.grade = null;
end;
eg2. 学分管理
create trigger credits_earned after update of takes on (grade)
referencing new row as nrow
referencing old row as orow
for each row
when nrow.grade <> ’F’ and nrow.grade is not null
and (orow.grade = ’F’ or orow.grade is null)
begin atomic
update student
set tot_cred= tot_cred +
(select credits
from course
where course.course_id= nrow.course_id)
where student.id = nrow.id;
end;
数据冗余、 插入异常、 删除异常、 更新异常
最小函数依赖集是指没有任何冗余的函数依赖集
性质: 函数依赖集F的最小函数依赖集不一定唯一, 它与求解的次序有关
定理: 每一个函数依赖集F均等价于一个最小依赖集F'
各阶段的具体任务
• 需求分析阶段 : 准确、 全面和深入地了解和分析用户需求, 包括数据需求和处理需求
• 概念结构设计阶段 : 通过对用户需求进行综合、归纳和抽象, 形成一个独立于具体数据库管理系统的概念模型
• 逻辑结构设计阶段 : 将概念结构转换为某个数据库管理系统所支持的数据模型, 并对其进行优化
• 数据库物理设计阶段 : 为逻辑数据模型选取一个最适合应用环境的物理结构
• 数据库实施阶段: 运用数据库管理系统提供的数据语言及其宿主语言, 根据逻辑设计和物理设计的结果建立数据库, 编制和调试应用程序, 组织数据入库, 并进行试运行
• 数据库运行和维护阶段 : 数据库系统在运行过程中必须不断地对其进行评价、 调整和修改
– 实体——矩形
– 属性——椭圆形
– 联系——菱形
– 关键字—下划线
• 一个实体型转换为—个关系模式
• 一个 1:1 联系可以转换为一个独立的关系模式,也可以与任意对应的关系模式合并
• 一个 1:n 联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并
• 一个 m:n 联系转换为一个关系模式
• 三个或三个以上实体间 的一个多元联系可以转换为一个关系模式
• 具有相同码 的关系模式可以合并
索引:顺序、树状、哈希索引
索引的评价指标
- 支持的查询类型(精确查询、范围查询等)
- 时间复杂度(查询、插入、删除操作)
- 空间复杂度
顺序文件
树状索引 - B+树
动态、能够保持动态“平衡”
每个结点的指针数称为扇出
典型操作:查找、插入(可能引起节点分裂)、删除(可能引起节点合并)、更新
如果块大小是固定的(与磁盘和缓冲区管理的约束有关),那么B+树的查询性能是不错的
B+ 树有下面 5 个重要的特点:
1、 B+ 树包含 2 种类型的结点
内部结点(也称索引结点)和叶子结点
根结点本身即可以是内部结点,也可以是叶子结点
根结点的关键字个数最少可以只有 1 个,其余内部节点至少为2
2、B+ 树与 B 树最大的不同是内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中
3、m 阶 B+ 树表示了内部结点最多有 m-1 个关键字(或者说内部结点最多有 m 个子树),阶数 m 同时限制了叶子结点最多存储 m-1 个记录
4、内部结点中的 key 都按照从小到大的顺序排列,对于内部结点中的一个 key,左树中的所有 key 都小于它,右子树中的 key 都大于等于它。叶子结点中的记录也按照 key 的大小排列
5、每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接
漫画:什么是B+树? - 知乎https://zhuanlan.zhihu.com/p/54102723
图解B+树的插入过程【图文】_mob604756f06ed8_51CTO博客https://blog.51cto.com/u_15127565/2666184
B+ Tree Visualizationhttps://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
B+Tree及其创建过程_沐风清寒的博客-CSDN博客_b+树构建需要三个类来定义相关结点①BPTree(存储B树,及相关信息)class BPTree{ //最大存储关键字 public int max; //最小存储关键字 public int min; //跟结点(可能为叶子结点。也可能为索引结点) public Object root; }②IndexNode(索引结点,存储索引)class IndexNode{ ...https://blog.csdn.net/qq_41891805/article/details/104889333
目的: 使事务能快速存取数据库中的数据
索引方法选择: 决定在哪些表上建立索引, 在表的哪些列上建立索引, 建立什么样的索引等, 是关系数据库物理设计的基本问题, 对数据库性能影响很大
常用索引方法: B+树、 聚簇(cluster)索引等
索引的缺点
– 随着表中数据的变化, 需要维护表上的所有索引, 过多的索引将导致维护开销太大, 甚至使系统存放速率下降
– 索引本身是有存储开销的, 查找索引也要付出代价
适合在有关属性上建立索引的情形
– 主键和外键上 一般都建有索引
– 在一个(或一组) 经常在连接操作的连接条件中出现的属性上建立索引
– 在以读为主或只读的表(只要需要且存储空间又允许)建索引
– 对于等值查询, 如果满足条件的元组是少量的, 且存储空间允许, 可以考虑在有关属性上建立索引
– 对于范围查询, 可以在有关属性上建立索引
– 如果一个(或一组) 属性经常作为最大值和最小值等聚集函数的参数, 则考虑在这个(或这组) 属性上建立索引
1、为经常用作查询 选择的字段,建立索引
2、在经常用作表连接 的属性上,建立索引
3、限制表上的索引数目
对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作
4、不要在有大量相同取值的字段上,建立索引
在这样的字段(例如:性别)上建立索引,字段作为选择条件时将返回大量满足条件的记录,优化器不会使用该索引作为访问路径
5、短值上建立索引
不要在varchar(255)这种字段建立,索引
6、建立组合索引时,字段值差异很大的列,放在最前面
7、删除不再使用,或者很少被使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再被需要
数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响
分析、检查、优化、执行
数据库原理 关系查询处理_yky__xukai的博客-CSDN博客https://blog.csdn.net/yky__xukai/article/details/104722665
1、一般准则(启发式优化)
选择运算尽可能先做——减小中间关系
连接前适当预处理(排序、索引)
投影和选择一起做——避免重复扫描
投影还能与一些双目运算结合起来算——减少扫描次数
一些选择(等值)+笛卡尔积操作 转为 连接操作
公共子表达式只算一次,多次引用
连接操作尽量生成小的结果,可以借助交换律、或先投影去掉没用的属性
2、查询树
关系代数表达式的树形表示:叶节点是输入的关系(表),内部节点是关系操作,自底向上执行。
– 用户定义的一个对数据库读写操作序列
– 是数据库中不可分割的执行单位
– 是数据库恢复和并发控制的基本单位
– 数据库系统中通常有多个事务并行运行
• 原子性(Atomicity)
– 事务中的操作要么都做, 要么都不做 (All or None)
• 一致性(Consistency)
– 事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态
– 与原子性密切相关
• 隔离性(Isolation)
– 并发执行的各事务不能相互干扰
• 持久性(Durability)
– 事务一旦提交, 它对数据库的更新不再受后继操作或故障的影响
DBMS中事务处理必须保证其ACID特性, 这样才能保证数据库中数据的安全和正确
保证事务正确执行是事务管理器的工作
故障种类
• 事务故障
– 错误输入、 运算溢出等导致事务中断
– 这些错误有些是不可检测(如电话号码输错了1位), 有些是可以检测(如电话号码输漏了1位)
– 通过用户定义约束、 DBMS检查约束并启动触发器的方法可以捕捉并处理那些可被检测的错误
• 介质故障
– 若只是局部的故障, 通常能通过磁盘扇区的奇偶校验检测到
– 若磁头损坏, 将使整个磁盘无法访问, 常采用的解决方法是某种RAID模式、 备份、 冗余分布拷贝等
• 系统故障
– 由于系统重启、 OS软件故障、 DBMS代码错误、 掉电等造成
– 导致正在执行的事务状态丢失, 原因是内存的易失性
– 解决方法是在分离的、 非易失性的日志中记录所有数据库更新, 必要时进行恢复
可能对数据库造成的影响
• 数据库本身被破坏, 使数据库中全部或部分数据丢失
– 如系统故障、 介质故障等
• 数据库没有被破坏, 但因事务的运行被非正常终止而使数据库数据失去一致性(正确性)
– 如事务内部故障、 系统故障等
恢复的实现技术(转储、 日志、 检查点)
• 数据库恢复的基本原理
– 利用存储在系统别处的冗余数据来重建
• 冗余数据包括
– 日志文件
– 数据备份
事务的原子性与日志
• 事务的原子性: 事务要么作为一个整体被执行, 要么根本不执行
• 日志是一个日志记录的序列, 每个日志记录记录这某个事务的重要操作( 开始、 更新、 提交或中止等),日志的增长速度非常快
• 事务的交错执行使日志更复杂, 仅在事务结束后记录事务的全过程是不够的
• 在数据库恢复时, 对故障发生时已提交的事务进行重做(Redo), 对未提交的事务进行撤销(Undo), 从而保证所有事务的原子性
• 恢复管理器的第一个任务就是将所有事务划分为已提交事务和未提交事务两类
Undo日志规则
(1) 对每一个更新操作都生成一条undo日志记录
(2) 如果事务改变了数据库元素x, 那么日志记录必须在x的新值写回磁盘之前写到磁盘 (write aheadlogging,WAL)
(3) 如果事务提交, 则其Commit日志记录必须在事务改变的所有数据库元素已写到磁盘后再写磁盘
推断: 如果事务T的Commit日志记录已到达磁盘,该事务一定已经完成
系统故障( 造成主存中的临时数据丢失)
介质故障( 造成磁盘中的数据丢失)
解决方法: 数据库备份( archive) , 即维护一个与数据库本身分离的数据库拷贝。
前提: 备份以来的日志被保存, 且日志自身在故障后仍存在。
并发操作可能造成的数据不一致现象及其原因
• 导致数据库状态不一致的可能原因
– 故障发生
– 并发事务对数据的共享
• 并发操作可能引起的数据不一致
– 现象: 丢失修改、 不可重复读、 读脏数据
– 原因: 事务的隔离性被破坏, 事务间相互干扰
• 可串行性: 多个事务的并发执行是正确的, 当且仅当其结果与按某一次序串行地执行它们时的结果相同。
• 可串行性是并发事务操作是否正确的判别准则。
• 为了保证并发执行的事务能保持数据库的正确性,DBMS的并发控制机制必须提供一定的手段来保证调度是可串行化的。
• 并发控制的思想: 调度器可能推迟一些操作的执行, 甚至可能中断一个事务。
• 冲突的操作: 涉及同一数据元素, 且至少有一个写操作
• 如果通过一系列相邻动作的非冲突交换能将他们中的一个转换为另一个, 我们说两个调度是冲突等价的。
• 如果一个调度冲突等价于一个串行调度, 我们说该调度是冲突可串行化的。
• 冲突可串行化调度是可串行调度的充分条件,是商用系统中的事务调度器在需要保证可串行性时通常使用的条件。
• 一级封锁协议
– 事务T在修改数据R之前须先对其加X 锁, 直至事务结束
– 可解决丢失修改问题
• 二级封锁协议
– 读数据前加S锁, 读完即释放
– 写数据前加X锁直至事务结束
– 可解决丢失修改和读脏数据问题
• 三级封锁协议
– 读数据前加S锁直至事务结束
– 写数据前加X锁直至事务结束
– 可解决丢失修改、 读脏数和不可重复读问题