数据库相关知识整理

发布时间 2023-11-14 20:26:07作者: LiXiang98

关系代数

  • U 并集 Union 结构相同 取所有部分
  • n 交集 取相同部分
  • - 差集 减掉相同的部分
  • x 笛卡尔积 列:R列数+S列数;行:R行数*S行数

关系代数运算

投影
选择
连接

Sql语言

  • DDL
    Data Definition Language,即数据定义语言.数据定义语言是由SQL语言集中负责数据结构定义与数据库对象定义的语言,并且由CREATE、ALTER、DROP和TRUNCATE四个语法组成。
  • DML
    Data Manipulation Language,即数据操纵语言,主要由insert、update、delete语法组成。
  • DCL
    Data Control Language,即数据控制语言。用来授权或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,能够对数据库进行监视。比如常见的授权(GRANT)、取消授权(REVOKE)、回滚、提交等等操作。
  • DQL
    Data Query Language,即数据查询语言,用来进行数据库中数据的查询。

模式

模式 视角 抽象 具体 其他
外模式 用户 视图层 DML\CRUD 用户操作
模式 整体 逻辑层 DDL 逻辑独立性
内模式 存储 物理层 存储结构 物理独立性

外模式(多个)<——>模式<——>内模式
三级模式两级映像
模式固定,实例变化。

Sql执行顺序

from——>where——>group by ——> having——>select——>order by——>limit

数据依赖

函数依赖

  • 平凡函数依赖
    (学号,姓名)-->姓名 我决定我自己
  • 非平凡函数依赖
    学号-->(姓名,年纪)我能决定其他
  • 完全函数依赖
    所有成员决定
    (学号,课程)--> 成绩
    学号-->学生
  • 部分函数依赖
    部分成员决定
    (学号,班级)-->班长
  • 传递依赖
    学生-->班级-->班长

多值依赖

1:m 一对多 x-->-->y
m为1时,函数依赖时特殊的多值依赖。

数据库范式

1NF

属性不可再分

2NF

非主属性完全依赖于主键,存在传递函数依赖

3NF

非主属性直接依赖于主键,消除传递函数依赖

BCNF

消除3NF的主属性依赖,1个候选键肯定是BCNF

4NF

消除3NF的多值依赖

模式分解

  1. 无损连接
  2. 是否函数依赖
  3. 既无损连接,又保持函数依赖

数据库故障与恢复

建立数据冗余:数据转存与建立日志文件

事务故障

引发原因:程序错误、逻辑错误、系统错误
修复方式:Undo

系统故障

引发原因:硬件、软件(操作系统)故障
修复方式:Redo

介质故障

引发原因:磁盘损坏,
修复方式:重装数据库,装载备份和日志文件,DBA介入,再由系统撤销及重做。

  1. X锁(排他锁)独占,其他事务既不能读也不能其他操作
    使用排它锁前需要先检查是否已有排它锁存在。
  2. S锁(共享锁)其他事务只读

事务

特点:原子性、一致性、隔离性、持久性
原子性:要么全部成功,要么全部失败,不存在只成功一部分。
一致性:从一个一致性的状态转到另一个一致性的状态。
隔离性:其他事务不知道当前事务,其他事务对当前事务不可见。
持久性:事务提交,其所作更改保存到数据库。

事务并发

数据不一致
问题:

  1. 修改丢失
    发生在Update
    修改数据过程中查询,发现数据还是修改前的数据
  2. 脏读
    发生在Update
    读到了未提交的还在缓存中的数据
  3. 不可重复读
    发生在Update/Delete
    一个事务中两次读取数据结果不一样
  4. 幻读
    发生在Insert

隔离级别

  1. 读未提交,可能存在脏读,读取到了未提交的数据
  2. 读已提交,解决了脏读
  3. 可重复读,解决了不可重复读
  4. 序列化读,解决了事务并发的所有问题

数据库封锁协议

在保证事务一致性的前提下,尽可能提高并发。
封锁协议:对数据加锁,加锁时间和释放时间的规则描述。

一级封锁协议

事务修改数据,加x锁,直到事务结束,才释放x锁。
针对改,解决了丢失修改问题

二级封锁协议

一级封锁协议+
事务读取数据,加s锁,读完立即释放s锁。
针对改+读,解决了读脏数据,未解决不可重复读

三级封锁协议

二级封锁协议+
事务读取数据加S锁,直到事务结束,才释放S锁。
针对改+读,解决了不可重复读

两段锁协议

  1. 对任何数据的读写前,都必须先加锁。 应加尽加,不解锁。
  2. 释放某个锁以后,不得再去尝试获取其他锁。 集中解锁,不允许再加。

两段锁协议是可串行化的充分非必要条件,采用两段锁协议,仍然可能产生死锁。

并发调度

串行调度:不允许事务并发,所有事务排队
可串行化调度:事务并发调度的执行结果与某个串行调度的执行结果等价(串行等价)
可串行化未必遵循两段锁协议。