数据库系统 期末考前复习
数据库系统 期末考前复习
introduction to DBMS
重点掌握数据库系统的三层模式结构和两层映像的功能
三层模式结构
- 内模式(存储模式)数据的物理结构和存储方式的描述(Simple DB涉及)
- 模式(逻辑/概念模式)数据的逻辑结构和特征的描述
- 外模式(用户模式)局部数据的逻辑结构和特征的描述,应用程序员和最终用户能够看见和使用
两层映像
- 外模式<->模式 一个模式可以有任意多个外模式 逻辑独立性
- 模式<->内模式 模式/内模式的映射是唯一的 物理独立性
ER转化关系模型、主外键约束
ER转化关系模型
多对多,一对多的合并
Subclass Entity
- Object Oriented:each object can only belong to a single table 最省存储空间
- the E/R Approach(拆分表): 子类额外属性单独建表,将父类主键当作子类表的外键和主键
- The Null Value Approach: Too many NULL’s (waste memory space)
完整性约束
- 实体完整性:主键不能为null
- 参照完整性:外键要么为空,要么为参照表的主键
- 用户定义完整性:属性的值要合法
SQL操作
SQL Type
DDL: CREATE, DROP
DML: INSERT, DELETE, UPDATE, SELECT FROM WHERE
SQL 查询
SELECT … FROM … WHERE …
LIKE后面
%代表任意字符串,_代表单个字符
ORDER BY
ASC升序(默认),DESC降序
IN, EXIST
ANY, ALL
DISTINCT
Aggregations
- sum求和
- avg求均值
- min求最小值
- max求最大值
- count计数
用法:SELECT AVG(price) FROM sells WHERE beer = ‘Bud’
GROUP BY
HAVING
在select from where之后对结果进行过滤
INTERSECT, UNION
intersect求交集,union求并集
SQL 授权
GRANT, REVOKE
1 | GRANT SELECT, UPDATE(PRICE) |
授权图
AP star star -> BP star -> CP star
若A revoke P from B cascade,则C的权限也会被级联收回。
DB 模式设计
坏的设计的后果
- 冗余
- 插入异常
- 删除异常
- 更新异常
插入、删除、更新三者一定同时出现
通过函数依赖找到关系的Key
Key->{all} but subset of Key doesnot -> {all}
Key的超集是Superkey
找Key:函数依赖左边没出现的一定不是Key的元素,函数依赖右边没出现的一定是Key的元素
再根据闭包比较,找到Key的其它元素
关系闭包
Armstrong公理系统
- 传递性
- 拆分性 x->yz == x->y & x->z
- 假言推理 x->y & yz->u == xz->u
无损分解
分解之和如果R1∩R2是R1或R2的超码,则R上的分解(R1,R2)是无损分解
保持函数依赖
如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的
范式
3NF<BCNF<4NF
BCNF
对于所有非平凡的函数依赖,左边都是superkey
分解为BCNF
- 检验R是否属于BCNF。如果是,返回{R}作为结果。
- 如果存在BCNF违例,假设为X→Y。计算X+。选择R1=X+作为一个关系模式,并使另一个关系模式R2包含属性X以及那些不在X+中的属性。
- 计算R1和R2的FD集,分别记为S1和S2。
- 递归地分解R1和R2。返回这些分解得到的结果集合。
3NF
违反3NF的情况:
X->A如果X不是superkey,并且A不是主属性
关系代数及查询过程
关系代数
- 并、交、差
- 投影、选择
- 自然连接
- 笛卡尔积
- 连接:先做笛卡尔积,再筛选
- 除法:结果等于被除集中有对应除集中所有元素的元素的集合
查询过程
表达式树
解析SQL语句->生成逻辑查询计划->逻辑优化->物理查询计划->代价估计->执行最优物理查询计划
查询优化
一般来说,选择操作和投影操作最先做
先选择,再投影
故障恢复
ACID性质:原子性、一致性、隔离性、持久性
start, commit, abort
REDO日志
redo日志记录的是新值
修改磁盘元素之前先将日志记录输出到磁盘日志文件
恢复:寻找没有commit的事务,从前向后扫描日志,对事务进行重新执行
解决redo日志恢复太慢的办法:checkpoint(CKPT)
- 停止接受新事务
- 等待所有事务完成
- 将所有日志存入磁盘
- 将所有缓冲区数据存入数据库
- 在数据库日志中打上ckpt标记
end ckpt指的是start ckpt之前的值全部已经写到了数据库磁盘上
UNDO日志
日志先在内存中写,不用每次操作都访问磁盘
修改磁盘元素之前先将日志记录输出到磁盘日志文件
undo日志记录的是旧值。
恢复:对于没有结束标记commit或abort的事务从后向前扫描日志,进行回滚。回滚完成后需要在日志文件中添加abort记录
REDO/UNDO日志
缺点
undo:可能增加IO代价
redo:可能使缓冲区短缺
恢复策略
redo所有commit的事务(从前向后)
undo所有未完成的事务(从后向前)
并发控制
冲突可串行化调度
优先图(只能解决是否可以冲突串行化调度)
查看调度,写操作和写操作所代表的事务连一条有向边,读操作和写操作所代表的事务连一条有向边即可。读操作和读操作不互斥,不要连边!
判断是否可以冲突可串行化调度
- 列出每个事务
- 画出优先图
- 判断优先图是否有环
两段锁(不能解决死锁问题)
两端锁是悲观策略
两段锁规则
- well from transaction:访问前上锁,访问后解锁
- legal scheduler:只有唯一事务可同时对一个对象上锁
- 2PL:加锁前不能有解锁命令,解锁后不能有加锁命令
预防死锁
一次封锁法(降低并发度)
顺序封锁法(维护成本高,难实现)
读锁、写锁、意向锁
S, X, IS, IX之间的互斥关系