数据库基础知识
title: 数据库系统概论
tags: 数据库
date: 2022-06-28 20:02:16
category: 数据库学习
第一章 绪论
1、数据的独立性
- 物理独立性:用户程序和数据库中的数据的物理存储是相互独立的。
- 逻辑独立性:用户程序和数据库的逻辑结果是相互独立的。
- 保证:二级映像功能
2、数据模型
数据模型的作用:数据模型是数据库系统的基础,任何一个DBMS都是以某一个数据模型为基础。
数据模型的三个要素:数据结构、数据操作、数据完整性约束条件
3、数据库、数据库系统
数据库概念:数据库是长期储存在计算机中、有组织、可共享的大量数据的集合。
数据库系统概念:数据库系统是由数据库、数据库管理系统、应用程序、数据库管理员组成的存储、管理、处理和维护数据的系统。
数据库系统的特征:①数据结构化(和文件系统的本质区别);②数据独立性高;③数据的共享性高、易扩充、冗余度低;④由数据库管理系统统一管理。
4、数据库管理系统的主要功能:
- 数据库定义功能
- 数据组织、存储和管理功能
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 其他功能,如不同数据库之间的互访和互操作等功能。
第二章
1、关系数据库结构及其形式化定义
- 关系:> 域(domain)、笛卡尔积(cartesian product:n元组,做笛卡尔积的每个集合中贡献一个数组成的集合;一个域允许的最大的不同取值的个数叫做基数)
> n元关系(笛卡尔积的子集),属性,二元表格中的域,候选码->主码,主属性,非主属性/非码属性,全码 - 关系的类型:基本关系(基本表/基表)、查询表、视图
- 关系模式、关系(有一说一,这个不知道重点在哪里)
2、关系操作
- 关系操作的特点、非关系操作的特点
3、关系的完整性(三类完整性约束条件)
- 关系的两个不变性
- 实体完整性:实体完整性规则+实体完整性(?不太明白例题讲了是干啥的)
- 参照完整性:
- 外码(foreign key)、参照关系(referencing relation)、被参照关系(referenced relation)/目标关系(target relation)
- 关系R和S不一定是不同的关系(理解一下书上的例题)
- 关系间引用属性->相互制约
- 用户定义的完整性
4、关系代数
- 传统的集合运算
- 并(union):
- 差(except)
- 交
- 笛卡尔积
- 专门的关系运算
- 选择(select)
不等于:<> - 投影(projection):对列的操作
- 连接(join):等值连接(equal join) & 自然连接(natural join)(本质上是在自然连接基础上取消重复的列)
悬浮元组、外连接(outer join:保留悬浮元组的值,空的地方置NULL)、左外连接(只保留左边关系的悬浮元组)、右外连接 - 除运算(division):记住书上的例子吧~
- 选择(select)
- 五种基本运算
5、关系的完整性
·专门的关系运算
> 选择:
> 投影:积分投影
> 连接:
非等值连接:
等值连接:
自然连接:自然连接是等值连接去掉相同的属性列后的结果
第三章 关系数据库标准语言SQL
1、注意事项
※对于表意不明确的地方,要加上表名
※多做几遍评测平台的题目
※写sql语句的注意事项
※对于同一个表查询的时候,记得起别名
2、数据定义:
alter table <表名>
[add [column] <新列名><数据类型>[完整性约束]]
[add<表级完整性约束>]
[drop [column]<列名>[cascade|restrict]]
[drop constraint<完整性约束条件>[restrict|cascade]]
[alter column<列名><数据类型>]
- cascade:对表的删除没有约束条件
- restraint:想要删除的基本表不能被其他表所引用
对表的约束(列级约束和表级约束)
列级约束有六种:主键Primary key、外键foreign key 、唯一 unique、检查 checck 、默认default 、非空/空值 not null/ null
表级约束有四种:主键、外键、唯一、检查
3、数据查询:
- distinct:消除重复的行
- between and;not between and: 确定范围
- in; not in: 确定集合
- like; not like: 字符匹配,a%b,以a开头,以b结尾,任意长度的字符串;a_b,以a开头,以b结尾,总长度为3的字符串
- is null; is not null: 空值
- and, or, not:逻辑运算
- 聚集函数
- group by:将查询结果按某一列或多列的值分组,值相等的为一组
- 等值与非等值连接到查询
- 等值连接
- 自然连接
- 自身连接:要新建别名
- 外连接:悬浮元组、左外连接、右外连接
- 多表连接:很多个表进行连接的时候,直接进行条件连接,不写嵌套查询
嵌套查询:
子查询不能使用order by语句,order by只能对最终结果进行排序
对于查询结果是集合的情况,使用谓词in
不相关子查询
相关子查询:父查询定义的别名,子查询会用到
- any(some);all
- exists
- 集合查询:union,intersect,except
数据更新
插入数据:如果是数字的话,不要加引号!!!
修改数据:update student set sage = 22 where sno = '0501029'
删除数据:delete from student where sno = '0501029'
空值的处理
向表中插入空值,直接插入NULL,不加引号,像数字一样
空值的判断:is null; is not null
4、视图
- 行列子集视图
- 视图的作用
- 视图相关sql语句
视图:命名化的select语句
视图的定义存储下来
--存在系统数据字典中
create view v_student () as + 子查询
select student.sno,sname,cno,grade
from Sdtudent, Sc
where student.sno = sc.sno and cno = '2'
select * from v_student
子查询结果会作为视图结果
select * from
视图作用:简化了用户书写SQL的复杂度
保证了数据的安全性
一定程度上保证数据的逻辑独立性
----视图(连接查询、聚集函数)
--行列子集视图(来源于单表,视图中包含主键,只是去掉了不重要的属性列,并且去掉的属性列都可以取值为空)
--with check option
---视图中,尽量不要带*号
create view v_stu(sno,sname)
as
select sno, sname
from Student
where sdept = '计算机'
drop view 删除视图
第四章 数据库安全性
1、本章基于重点复习
- 自主存取权限控制
- grant
- revoke
- 角色
- 完成权限的授权并传递出去
2、存取控制
- 存取控制
- 数据库管理系统的存取控制子系统:定义用户权限+合法权限检查机制
- 自主存取控制(DAC)
- 强制存取控制(MAC)
- 自主存取控制方法
- 用户权限:数据库对象、操作权限
- 定义存取权限=授权
- 授权:授予与收回
- grant:grant <权限> on <对象类型><对象名> to <用户> [with grant option];//不一定是只有一个权限,一个对象
with grant option: 被授权用户可以把权限授予其他用户,不能授予祖先用户 - revoke:revoke <权限> on <数据对象> from <用户> [cascade|restrict];
- revoke update(sno) on table student from userx;
- grant:grant <权限> on <对象类型><对象名> to <用户> [with grant option];//不一定是只有一个权限,一个对象
- 数据库角色
- 角色是权限的集合
- 创建角色:create role <角色名>
- 给角色授权:grant <权限>
第五章 数据库完整性
1、定义外键:
foreign key(属性) references student(属性)
2、触发器
第六章 关系数据理论
1、问题的提出
- 关系模式可能存在的问题:数据冗余、更新异常、插入异常、删除异常
2、规范化
- 函数依赖:函数依赖定义、非平凡函数依赖、决定属性组/决定因素、完全函数依赖、传递函数依赖
- 码:候选码、超码、(候选码的任何真子集不一定是超码)、主码、主属性、非主属性/非码属性、全码、外部码/外码
- 码:是码,就得能找出来一对一关系
范式
规范化
2NF:①每一个非主属性完全依赖于任何一个候选码。②存在问题:插入异常、删除异常、修改复杂
3NF:①不存在传递函数依赖。②画有向图,根据图去判断是不是
BCNF:①Y非平凡函数依赖X,X有主码。
多值依赖:①多值依赖的性质;②多值依赖与函数依赖的区别
和BCNF类似,把函数依赖改成多值依赖即可
P189:规范化过程
3、函数依赖的公理系统
第七章 数据库设计
1、数据库设计概述
需求分析 -> 概念结构设计 -> 逻辑结构设计 -> 物理结构设计 -> 数据库实施 -> 数据库运行和维护
2、需求分析
数据字典:
数据项(最小单位)
数据结构(数据间组合关系)
数据流(数据结构在系统内的传输路径)
数据存储(数据结构停留或保存的地方)
处理过程
3、概念结构设计
- E-R模型
- 实体之间的联系:两个实体型之间的联系:1:1 / 1:n / n:m ; 两个以上实体间的联系:同两个
- 参与联系的实体型的数目成为联系的度。N元联系
-E-R图- 实体型 -> 矩形; 属性 -> 椭圆; 联系 -> 菱形(标注1:1, 1:n, n: m)
- (多理解一下课本上的例子)
4、逻辑结构设计
- E-R图向关系模型的转换
第九章 关系查询处理和查询优化
1、关系数据库系统的查询处理
-
查询处理步骤
查询分析(语法)->查询检查(语义,视图,权限,完整性约束->关系代数表达式)->查询优化(代数优化、物理优化)->查询执行 -
视图消解法:把对视图的操作转换为对基本表的操作,由DBMS完成
2、实现查询示例的算法示例
-
选择操作的实现
- 简单的全表扫描算法(table scan):读+判断,不适用选择率低的情况
- 索引扫描算法(index scan)
-
连接操作的实现
- 嵌套循环算法(nested loop join):俩for循环
- 排序-合并算法(sort-merge join/merge join):双指针
- 索引连接算法(index join)
- hash join算法(?)
-
实例分析:
eg:求选修了2号课程的学生的姓名。假定数据库中,有1000个学生记录,10000个选课记录,其中选修2号课程的选课记录为50个。- 先计算笛卡尔积:先算读入需要多少块,然后加上连接需要多少块,最后加上选择需要多少块。
- 先做自然连接
- 先选择
-
当选择和连接同时存在时,先做选择操作。
3、代数优化(具体做的时候理解一下)
- 关系代数表达式等价变换原则
- 连接、笛卡尔积的交换律
- 连接、笛卡尔积的结合律
- 投影的串接定律
- 选择的串接定律
- 选择与投影操作的交换律
- 选择与笛卡尔积的交换律
- 选择与并的分配律
- 选择与差运算的分配律
- 选择对自然连接的分配律
- 投影与笛卡尔积的分配律
- 投影与并的分配律
- 查询树的启发式优化
- 典型的启发式规则:①先选择;②同时投影和选择;③把投影和其前后的双目运算所结合;④连接运算比笛卡尔积快;⑤找公共子表达式(具体含义没看懂)
第十章 数据库恢复技术
1、事务
2、事务语句
begin transaction:
commit:
rollback:
3、事务的ACID特性
Atomicity, Consistency, Isolation, Durability
4、事务故障:数据库被破坏,事务未完成
- 事务内部故障:可预期; 不可预期
- 系统故障(软故障):回滚、redo
- 介质故障
- 计算机病毒
- 故障对数据库影响的两种可能
借助冗余来实现恢复
5、恢复的实现技术
- 数据转储(基本技术)
后备副本/后援副本
静态转储; 动态转储(日志文件)
海量转储; 增量转储 - 登记日志文件(记录更新操作)
以记录为单位的日志文件- 内容:事务标识,操作类型,操作对象,更新前的旧值,更新后的新值
以数据为单位的日志文件
日志文件作用
登记日志文件原则: 时间顺序; 先日志后数据库
- 内容:事务标识,操作类型,操作对象,更新前的旧值,更新后的新值
6、恢复策略
- 事务故障恢复: 反向扫描日志,找更新操作 -> 逆操作 -> 直到开始
- 系统故障恢复: 正向扫描日志文件,+redo_list & + undo_list -> undo队列undo -> redo队列redo
- 介质故障的恢复: 重装数据库(对动态转储而言,还要加上日志文件),重做已完成的事务
7、具有检查点的数据恢复技术
- 检查点记录的内容:建立检查点时刻所有正在执行的事务清单,这些事务最近的日志记录的地址
- 步骤:写日志 -> 在日志中写检查点 -> 数据缓冲区数据写入磁盘 -> 把检查点记录的地址写入一个重新开始文件
第十一章 并发控制
- 并发控制的原因:①提高吞吐量和资源利用效率;②减少等待时间
1、三种数据不一致性
- 丢失修改(lost update)(写写)
- 不可重复读(non-repeatable read)(读写), 三种情况,增删改
- 读“脏”数据(dirty read)(写读撤)
破坏了事务的隔离性
并发控制的主要技术: 封锁(locking), 时间戳(timestamp), 乐观控制法(optimistic scheduler) 和 多版本并发控制(multi-version concurrency control, MVCC) 等.
基于时间戳的并发控制:
时间戳:当一个事务启动的时候,给这个事务一个时间戳。按照时间戳从小到大执行的操作是正确的,反之是不正确的,借助时间戳就不需要借助锁。如果存在冲突,就撤销该事务,并重启该事务,然后给该事务分配一个更靠后的时间戳。
冲突:读写,写写,写读
判断处理
学习博客
乐观控制法
2、封锁
排他锁、共享锁
3、封锁协议
- 一级封锁协议:无法解决不可重复读和读“脏”数据
- 二级封锁协议:以一级封锁协议为基础,读完释放
- 三级封锁协议:以一级封锁协议为基础,事务结束释放
重点理解一下二级封锁协议和三级封锁协议之间的联系与区别
4、活锁和死锁
- 活锁:一直在等待,解决方法:先来先服务
- 死锁:出现环
- 死锁的预防
- 一次封锁法:某个事务所要用到的全部数据加锁
- 顺序封锁法
- 死锁的诊断与解除
- 超时法
- 等待图法(T1等待T2,T1指向T2),方法是选择一个处理死锁代价最小的事务
5、并发调度的可串行化
- 可串行化调度
- 可串行性
- 冲突可串行化调度 Ri(x)与Wj(x) & Wi(x)与Wj(x)
不同事务的冲突操作和同一事务的两个操作是不可交换的
冲突可串行化调度
冲突可串行化调度是可串行化调度的充分条件
(?):注意理解可串行化调度,感觉有点晕
6、两段锁协议(2PL协议)
- 加锁 + 解锁
- 事务遵循两段锁协议是可串行化调度的充分条件,不是必要条件。
- 一次封锁法与两段锁协议(可能发生死锁)
7、封锁的粒度
- 封锁粒度
- 封锁粒度选择原则
- 意向锁
- IS锁, IX锁, SIX锁