数据库复习
面向老师的话
- 重点:关系数据库,数据库是什么,跟文件系统相比的优势,面向数据库比的劣势,跟noSQL数据库比的劣势;
数据库:长期存储在计算机内、有组织的、可共享的、大量的数据集合
比较:
文件系统:文件存储,数据面向对象是某个应用
- 数据依赖、相关性:每个程序都要维护它们使用的文件的元数据
- 数据冗余:不同系统或程序有相同数据的不同副本,多种文件格式的信息重复
- 有限的数据共享,没有数据的集中控制
- 漫长的开发时间,每个新的应用都要重新设计文件
- 程序维护过度
- 数据访问困难
- 完整性问题,难以添加新约束或改变现有约束
数据库系统:用于大规模数据管理,有数据库管理系统,处理方式包括联机实时处理、分布处理、批处理,数据面向对象是现实世界(如一个企业、跨国公司)。
- 数据共享、冗余少、数据-程序独立、方便的程序接口、数据访问高效、数据完整性和数据安全、并发管理
- 结构化数据存储,自动管理数据关系
核心内容:数据模型
3级模型:概念、逻辑(面向对象)、物理
- 概念模型:按照用户的观点对数据和信息建模,用于数据库设计
- 逻辑模型:按计算机系统的观点对数据建模,用于DBMS实现,描述数据库中的数据语义、数据关系、数据约束和数据操作;三要素:数据结构、数据操作、数据约束
- 物理模型:描述如何在存储设备中组织数据
概念模型ER图(必出),基数比约束、键要标注,不然扣分;
ER Model vs. Relational Model
- 两者都用于模拟数据
- ER模型有许多概念
- 实体,关系,属性等
- 非常适合捕获应用程序需求
- 不太适合计算机实施(甚至没有对其结构进行操作)
- 关系模型
- 只有一个概念:关系
- 由一系列表格来表示的
- 非常适合在计算机上进行高效操作
关系模式,数据结构,二维表性质,在其上做的操作(语句),会出很多题,出难题(要做题);
约束,trigger,不会让具体去写,但需要会概念、trigger的机制。ECA
约束:域完整性约束、实体完整性约束、参照完整性约束、用户自定义完整性约束
域完整性约束:数据类型、取值范围、unique、唯一值、默认值、check约束
触发器:触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.。可以实施比检查更复杂的操作,允许用户指定检查的事件。
物理模型的索引,索引概念,构建的基本原则,在什么字段构建,为什么构建;
- 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
- 只能定义在基本表上,不能定义在视图上
数据库设计,不考细节,会基本思路,新奥尔良法;
新奥尔良法将数据库设计分为:需求分析、概念设计、逻辑设计、物理设计。
规范化理论,啥是好的数据库模式,有啥异常,怎么消除这些异常;不同的范式;给一堆依赖关系,找主键,判断属于第几范式,咋分解;
如何按照一定的规范设计关系模式,将结构复杂的关系分解成结构简单的关系,从而把不好的关系数据库模式转变为好的关系数据库模式,这就是关系的规范化。
好的数据库模式: 尽可能少的数据冗余、没有插入、删除、更新异常;
规范化的目的:使结构合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。
ACID代表啥含义,怎么就保证ACID了,怎么合理调度;
- A 原子性
- 事务中的操作要么全做要么都不做
- C 一致性
- 事务执行的结果是,数据库从一个一致性状态变到另一个一致性状态
- 当数据库中只包含成功事务的提交结果时,数据库处于一致性状态
- 系统重启后,恢复子系统要撤销(UNDO)所有未完成事务,重做(REDO)所有已提交事务
- I 隔离性
- 一个事务的执行不被其他事务干扰
- 一个事务的内部操作使用的数据对于其他事务而言是隔离的
- D 持续性
- 事务提交后,其对数据库的更改是永久的
事后调度;
数据库实际运行是事前调度,调度规则的理解,基于锁的调度方法,啥是锁,咋用锁定机制判断这条指令是否执行,什么时候执行;会出难题,事务管理机制要搞清楚;
死锁:等待对方释放锁的事务循环;
预防:
- 一次封锁法:一次对所有数据加锁
- 顺序封锁法:预先规定加锁顺序
- 根据事务时间戳分配优先级
- 死亡等待策略:如果
Ti
比Tj
优先级高,则Ti
等待Tj
,否则Ti
中止- 伤害等待策略:如果
Ti
比Tj
优先级高,Tj
中止,否则Ti
等待诊断:
- 超时法:超过规定时限
- 等待图法:一张有向图,由结点(正运行的事务)和边(等待情况)构成。若T1等待T2,则在T1、T2之间画一条有向边T1→T2。如果这张图中出现了回路,则会出现死锁。
解除:一般的做法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使得其他事务得以运行下去,对撤销的事务必须加以恢复
事务调度
串行调度:多个事务依序串行执行,且 只有当一个事务的所有操作执行完后,才执行另一个事务的所用操作。
并行调度:利用分时的方法同时处理多个事务;
安全性机制,数据完整性约束,备份恢复,简单,快速读一下就行;
安全性目标:Secrecy、Integrity、Availability
通常将权限与视图联合起来使用,控制用户的子模式,实现数据的安全性控制。
备份恢复
<T,X,v>
- 撤消日志记录
- 输出OUTPUT必须早于
- 如果看到,则T肯定已将其所有数据写入磁盘(因此,不需要撤消)
- 重做日志记录
- 输出OUTUT必须晚于
- 如果没有看到,则T肯定没有将任何数据写入磁盘(因此磁盘上没有脏数据)
<T,X,u,v>可以早也可以晚
最后两节课:非关系型数据库,了解关系数据库面临的挑战;存对象,解决xxxx问题;非CA系统,打破一致性的CA系统约束;
- BASE
- Basic Availability:基本可用(允许部分query不成功)
- Soft-state :软状态/柔性事务,可以理解为”无连接”的, 而 “Hard state” 是”面向连接”的
- Eventual consistency:最终一致性,最终整个系统(时间和系统的要求有关)看到的数据是一致的。
SQL语言期中考试的难度。。。好害怕呜呜呜,让做快点。
SELECT[ALL|DISTINCT|DISTINCTROW|TOP] {*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} FROM tableexpression[,…][IN externaldatabase] [WHERE…] [GROUP BY…] 按照某个列的值进行【行分组】,列值相等的行是一组,通常会在每一组使用聚集函数 [HAVING…] 只有满足条件的【组】可以被输出 [ORDER BY…] 对结果按照某个列的值进行升序ASC或降序DESC -- 以DB_开头,倒数第三个字符是i的name WHERE name LIKE "DB\_%i__" ESCAPE '\' -- 转义\, COUNT(*) 计算元组的个数, COUNT(DISTINCT <列名>)计算列值中不重复的值得个数 SUM 计算列值的和 子查询的select语句不能用order by,它只能对最终结果排序 带有EXISTS谓词的子查询: 先求外层查询的第一个元组,根据他与内层查询相关的属性处理内层查询,如果内层查询结果不为空,内层查询返回真值,表明外层查询的这个元组符合要求,然后再检查外层查询的下一个元组;; 所有带IN、比较、any、all谓词的子查询都可以被EXISTS替换;
cascade | 级联 |
concurrent | 并发 |
intersection | 交 |
normal form | 范式 |
normalization | 规范化 |
project | 投影 |
semantic | 语义 |
locking protocol | 封锁协议 |
面向ppt
02ERmodel
多元关系
02Data Model P33
roles
ER模型设计原则
避免冗余、可以用属性时不要用实体
实体集至少满足:
- 不仅仅是某个事物的名称,至少有一个非键属性
- 是一对多或多对多关系中的多
属性满足:不再具有需要描述的属性、不能与其他实体相联系
键
一个键可以由多个属性组成
超级键:一个或多个属性的集合,其值唯一地决定每个实体。
候选键:最小超级键
主键:选择一个候选键作为主键。
03RelationalModel
ER模型转为关系模型
ER模型 关系模型
实体集E=关系的属性是E的属性
关系R=关系R的属性+相关实体的键
- 一对多关系中,ER转关系模型,“关系”可以附着在“多”的表格中
- 具有相同键的关系模式可合并
完整性约束
域完整性约束:加在属性的值上
实体完整性约束:由主键定义(唯一、非空)
引用完整性约束:要求关系(表)的一个属性(列)的每个值作为另一个属性的值存在于不同(或相同)的关系(表)中
unique key:可唯一标识表中每一行,允许空值,可以有多个
04 Relational Algebra
-
Binary operations 二元运算
- Union并:R1 U R2,输入2张schema相同的表输出一张表,关系代数要求重复行只留一个,而实际产品可以自己选择是否保留;
- difference差,R1-R2,输入2张schema相同的表输出一张表;
-
Unary operations一元操作
- Selection选择:Notation: σc®,c is a condition: =, <, >, and, or, not;
- Projection投影,返回某些列,ΠA1,…,An®,去重
- Cartesian Product笛卡尔积,R1×R2,输入模式R1(A1,…,An), R2(B1,…,Bm),输出模式为S(A1,…,An, B1,…,Bm)
-
Derived RA Operations派生操作
-
intersection交:输入schema相同的两张表,R1∩R2 = R1 - (R1 - R2)
-
join(连接)
-
θ连接:连接效果是对笛卡尔积的结果做选择
- 涉及谓词的连接
- 符号:R1⋈θR2,θ是一个条件
- 输入模式:R1(A1,…,An),R2(B1,…,Bm)
- 输出模式:S(A1,…,An,B1,…,Bm)
-
自然连接
-
符号:R1⋈R2
-
输入模式:R1(A1,…,An),R2(B1,…,Bm)
-
输出模式:S(C1,…,Cp) where C1,…,Cp=A1,…,AnUB1,…,Bm
-
含义:将R1和R2中的所有元组进行合并,以确定属性:A1,…,An B1,…,Bm(称为连接属性)
-
步骤:①R×S②选择所r[Ai]=s[Aj]的元组;③消除重复属性
-
-
-
-
等值连接
-
符号:R1⋈A=BR2
自然连接是一种特殊的等值连接 -
外连接,避免信息丢失,左、右、全外连接
-
左外连接 = 自然连接 + 左侧表中失配的元组。
-
右外连接 = 自然连接 + 右侧表中失配的元组。
-
全外连接 = 自然连接 + 两侧表中失配的元组。
-
-
division除运算
R(x,y) S(y)
R÷S = ∏x® -∏x(( ∏x® ×S) - R ),有所有的y的x
应用:对“所有”的、“至少”对,这里的“所有”、“至少”就是除关系S(y)
-
关系代数允许我们以自然的方式表达操作序列,局限是不能计算传递闭包。
07规范化理论
3方面内容:函数依赖、范式、模式设计,函数信赖起着核心的作用,是模式分解和模式设计的基础,范式是模式分解的标准。
函数依赖
-
关系模式中的各属性之间相互依赖、相互制约的联系称为数据依赖。数据依赖一般分为函数依赖、多值依赖和连接依赖。函数依赖是最重要的数据依赖,分为完全函数依赖、部分函数依赖、传递函数依赖;
-
平凡函数依赖:子集关系,不说明时讨论非平凡函数依赖。
-
只能根据语义来确定一个函数依赖,而不能按照其形式化定义来证明一个函数依赖是否成立。反映了一种语义完整性约束。函数依赖关系的存在与时间无关。
-
函数依赖可以保证关系分解的无损连接性。
-
函数依赖基本性质
- 投影性:决定子集(A,B)→A
- 扩张性:若X→Y且W→Z,则(X,W)→(Y,Z)
- 分解性:若X→Y且X→Z则必有X→(Y,Z)
- 合并性:若X→(Y,Z),则X→Y且X→Z。
-
完全函数依赖,X决定Y,X的任意真子集不决定Y
-
求最小函数依赖 (09逻辑结构设计P74)
范式
- 第一范式
- 所有属性都是简单属性,不可再分;
- 满足第一范式,规范化关系
- 第二范式
- 每个非主属性都完全函数依赖于R的每个候选码/关系键;
- 关系键是单属性,2NF
- 仍有数据冗余,插入、删除、更新异常
- 第三范式
- 每个非主属性都不传递依赖于R的每个主键/候选码/(关系键)
- 3NF可能存在主属性对候选键的部分依赖和传递依赖
- 保持无损连接和函数依赖
- 一般而言3NF就够了
- BC范式
- R∈1NF,且所有的函数依赖X→Y(Y!∈X),决定因素X都包含了R的一个候选键;
- bcnf能无损链接,但不一定保持函数依赖
规范化实质是“单一化”的“一事一表”原则
- 判断分解具有无损连接性的方法
- 定理判别法R1∩R2➡R1-R2
- 列表法。判断模式分解是否具有无损链接性 - 光何 - 博客园 (cnblogs.com)
非规范化
-
考虑非规范化处理的情况
-
大量频繁的查询过程所涉及的表都需要进行连接;
主要的应用程序在执行时要将表连接起来进行查询;
对数据的计算需要临时表或进行复杂的查询。
-
-
非规范化设计的主要优点
- 减少了查询操作所需的连接
- 减少了外部键和索引的数量
- 可以预先进行统计计算,提高了查询时的响应速度
-
非规范化存在的主要问题
- 增加了数据冗余
- 影响数据库的完整性
- 降低了数据更新的速度
- 增加了存储表所占用的物理空间
-
非规范化设计的管理最好用触发器实现
07 数据库设计
包括结构设计(静态模型设计)和行为设计(动态模型设计)
新奥尔良法将数据库设计分成需求分析(分析用户需求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。
-
数据库设计过程:新奥尔良法+数据库实施+数据库运行维护
-
设计方法
-
基于E-R模型的数据库设计方法
-
基于3NF的数据库设计方法
-
确定数据库模式中的全部属性和属性间的依赖关系,将它们组织在一个单一的关系模式中,然后再分析模式中不符合3NF的约束条件,将其进行投影分解,规范成若干个3NF关系模式的集合。
-
(1)设计企业模式,利用规范化得到的3NF关系模式画出企业模式;
(2)设计数据库的概念模式,把企业模式转换成DBMS所能接受的概念模式,并根据概念模式导出各个应用的外模式;
(3)设计数据库的物理模式(存储模式);
(4)对物理模式进行评价;
(5) 实现数据库。
-
-
基于视图的数据库设计方法
-
需求分析
- 需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
- 方法:
- 数据流图、数据字典,自顶向下的结构化分析方法,SA方法
- 面向对象分析方法
概念结构设计
将需求分析阶段得到的用户需求抽象为信息结构即概念模型的过程。
- 步骤:抽象数据并设计局部视图、继承局部视图得到全局概念结构、验证整体概念结构
- 自顶向下、自底向上、逐步扩展、混合策略4种方法
- 数据抽象
- 分类、聚集、概况
- 局部视图设计
- 选择局部应用,逐一设计分E-R图
- 常以中层数据流图作为设计分E-R图的依据
- 视图集成
- 一次集成、逐步累积式
- 合并分ER图(消除冲突:属性、命名、结构从图),修改与重构(消除冗余:分析方法、规范化理论)
逻辑结构设计
-
步骤:
- 将概念结构转化为一般的关系、网状、层次模型
- 将转化来的关系、网状、层次模型向特定DBMS支持下的数据模型转换
- 对数据模型进行优化
- 设计用户子模式
-
数据模型优化:1.确定数据依赖 2.对数据依赖进行极小化处理,消除冗余联系 3.按照数据依赖理论对 关系模式逐一分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各个模式的范式 4.针对应用环境分析是否需要分解合并
-
分解
- 水平分解(元组分组,适用于满足80/20原则的应用、并发事务经常存取不相交的数据(使每个事务存取的数据对应一个关系))
- 垂直分解(属性分组,经常一起用的属性为一组)
-
设计用户子模式
- 用符合用户习惯的别名
- 针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。(用不同视图授权不同应用)
- 简化用户对系统的使用(将复杂的查询定义为视图)
09 Constraints
-
primary和unique
- 一个主键多个唯一键,唯一键允许空值主键不行
check
CREATE TABLE Sells ( bar CHAR(20), beer CHAR(20) CHECK(beer IN(SELECT name FROM Beers)), price REAL CHECK ( price <= 5.00 ) ); # 只有Joe's Bar可以卖>$5的beer CREATE TABLE Sells ( bar CHAR(20), beer CHAR(20), price REAL, CHECK (bar = ’Joe’’s Bar’ OR price <= 5.00) );
-
断言assertion
- 我们必须在每次修改数据库的任何关系之后检查每个断言。
CREATE ASSERTION <name> CHECK ( <condition> );
触发器
-
基于属性和元组的检查能力有限,断言对于大多数约束应用有效但似乎很难实施
-
触发器可以包含Transact-SQL代码,实现复杂处理逻辑,可实现check约束不能实现的数据约束,但check约束简便高效
-
触发器允许用户指定检查的事件
-
又名ECA规则
- Event:数据库修改的类型如插入
- Condition:任何布尔表达式
- Action:任何sql语句
-
CREATE OR REPLACE TRIGGER <name> AFTER / BEFORE / INSTEDA OF INSERT / DELETE / UPDATE ON tableName REFERENCING OLD|NEW ROW AS <name>(表示对插入的行NEW或删除的行OLD的别名) FOR EACH ROW | STATEMENT (row表示行级,不写时为语句级) WHEN (布尔表达式) //action,d多条语句时用begin end环绕 CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer);
-
通常视图不可修改因为不存在,但是INSTEAD OF触发器允许合理修改
CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO LIKES VALUES(n.drinker, n.beer); INSERT INTO SELLS(bar, beer) VALUES(n.bar, n.beer); INSERT INTO FREQUENTS VALUES(n.drinker, n.bar); END;
09 存储过程
SELECT SNO,
SEX=
CASE sex WHEN '男' THEN 'M' WHEN '女' THEN 'F'
END
FROM S
-
游标CURSOR:一次处理一行或一部分行,从多数据记录的结果集中每次只提取一条记录。总是与一条select语句相关。允许应用程序对查询语句返回的行结果集中的每一行进行操作
Declare Cur_stu cursor for select * from tb_stu where sno between 1 and 6; Open cur_stu; Fetch first / last / prior(第一行) from Cur_stu; Fetch absolute (第n行)/ relative(当前位置向后n行)2 from Cur_stu ; Close Cur_stu ; Deallocate Cur_stu ;
10 transaction事务
- 事务状态
- active、partially committed、failed、aborted、committed
- aborted 中止:回滚并将数据库恢复到事务开始之前的状态之后
- 中止后
- 重启事务(只在没有内部逻辑错误情况下
- 杀死事务
- 中止后
- 并发
- 优点
- 提高处理器和磁盘利用率,从而提高事务吞吐量
- 缩短了事务的平均响应时间:短事务不需要在长事务之后等待
- 可能问题
- 丢失修改(修改覆盖)、不可重复读(修改、删除、增加)、读取脏数据(撤销)
- 优点
- 冲突的指令:两个事务指令冲突当且仅当他们访问同一个数据项且至少有一个write指令
- 串行调度(Serial schedule):各个事务之间没有任何操作交错执行,事务一个一个执行。
- 可串行化调度(Serializable schedule):如果一个调度的结果与某一串行调度执行的结果等价,则称该调度是可串行化调度,否则是不可串调度。
- 冲突可串行化调度(Conflict Serializability):一个调度通过一系列不冲突指令的交换转换成另一个调度,则这两个调度冲突等价,若冲突调度冲突等价与一个串行调度则称其可冲突序列化;
- 如果一个调度满足冲突可串行,则该调度是可串行化调度。但可串行化调度不一定满足冲突可串行。冲突可串行为可串行的充分条件。
- 级联回滚:单个事务提交失败导致一系列事务回滚
- T1 writeA,T2 readA,可恢复调度:T1的commit比T2的commit早,不可恢复就是晚。无级联调度:T1的commit比T2的read早;(无联级一定可恢复)
前驱图
-
如果两个事务发生冲突,我们从Ti到Tj画一条弧线,并且Tj访问了之前发生冲突的数据项。
-
当且仅当调度的优先级图是非循环的时,调度是可冲突序列化的。
-
如果优先图是非循环的,则可通过对图的拓扑排序得到可序列化次序。下图的序列化顺序可以是T5->T1->T2->T3->T4
封锁协议
- 一级封锁协议(解决丢失修改)
- 事务T修改数据R之前必须对其加X锁,直到事务结束才释放X锁;
- 事务T进行write(A)之前对A加X锁,直到T结束
- 二级封锁协议(解决丢失修改和脏数据)
- 在1PL基础上,增加:事务T读取数据R之前必须对其加S锁,读完后释放S锁
- 事务T进行read(A)之前对A加S锁,read完释放;
- 三级封锁协议(解决丢失修改、脏数据、不可重复读)
- 在1PL基础上,增加:事务T读取数据R之前必须对其加S锁,直到事务结束才释放S锁
- 事务T进行read(A)之前对A加S锁,直到T结束
2PL
事务分为两个阶段:
第一阶段是封锁,也称为扩展阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁;
第二阶段是释放封锁,也称为收缩阶段,事务可以释放任何数据项上任何类型的锁,但是不能申请任何锁;
- 如果所有事务都遵循两段锁协议,则对这些事务的任何并发调度策略都是可串行化的;
- 一次封锁法要求每个事务一次将所有数据加锁,一定遵循两段锁协议,但两段锁协议并不要求事务必须一次性将所有要使用的数据全部加锁,
- 2PL有可能会导致死锁。
- 优点:解决不可重复读、丢失更新、读取脏数据
- 严格2PL:事务所持有的所有锁仅在事务完成时才被释放,严格2PL解决联级回滚问题
11 recovery恢复
事务的基本操作:
INPUT(X)->READ(X,t)->WRITE(X,t)->OUTPUT(X)
读取X到内存缓冲区->把X拷贝给事务局部变量t->把事务局部变量t拷贝给X->把X写进磁盘
日志
日志是一个只能添加,的含有日志记录的文件,多个事务并发执行时日志记录是交叉存的
系统崩溃后,使用日志 重做一些未提交的事务/撤销其他没有提交的事务
登记日志文件时必须遵循两条原则:登记的次序严格按并发事务执行的时间次序;必须先写日志文件,后写数据库。
记录:
事务T开始
事务T提交
事务T中止
<T,X,v>事务T更新了元素X,旧的值为v
撤销日志规则:
1.如果事务T修改了X,那么<T,X,v>必须在X被写入磁盘之前写入磁盘
2.如果事务T提交,那么必须在所有事务T要执行的修改执行之后再写入磁盘
因此,输出是早期完成的(相比commit)
撤销的恢复步骤:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1THSCtS-1626501451791)(img/数据库复习之ppt_img/1426807-20180622213700903-485356098.png)]
注:undo操作是幂等的,可以多次执行,所以如果恢复时系统崩溃,只需再执行一遍恢复;
日志文件需要读完整,效率低,可以用检查点标志来提高效率;
重做日志规则:
如果事务T修改了X,那么<T,X,v>和必须在X被写入磁盘之前写入磁盘
因此,输出是后来完成的(相比commit)
重做的恢复步骤:
有START没有COMMIT或ABORT,没做完,重做
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VP4JMUWL-1626501451792)(img/数据库复习之ppt_img/1426807-20180622213715835-272542767.png)]
综合
撤销(Undo)和重做(Redo)的对比:
撤销:1.输出在前;2.如果日志里有,那么T一定把它要写的数据全部写入磁盘(所以此时不需要再撤销)
重做:1.输出在后;2.如果日志里没有,那么T一定还没有把任何数据写入磁盘(所以此时磁盘里没有脏数据)
输出时的灵活性:
把数据改变的记录修改:<T,X,u,v>,表示事务T修改了X,旧值为u,新值为v
撤销/重做的规则:
如果事务T修改了X,则<T,X,u,v>必须在X被修改之前写入磁盘。
修改后的规则对输出相对于commit的时间没有要求,可以在commit之前输出,也可以在commit之后输出
系统的恢复步骤:
1.扫描日志文件,确定每个事务是否完成(commit, abort都算完成),在故障发生前已经结束的事务记入重做序列,未完成的事务记入撤销队列
2.对撤销队列中的每个事务执行撤销(按照从后到前的顺序)
3.对重做队列中的每个事务执行重做(按照从前到后的顺序)
先进数据库技术
关系模型缺点:
- 有限的数据类型;
- 不能清晰表达复杂对象和对象之间的关系;
- 缺少对象身份标识。
用关系数据库存取对象,阻抗失配(Impedance mismatch)问题
对象映射到表的困难:对象含有复杂结构;存在大的非结构化的对象;存在类继承;映射结果可能:会导致:表存取的效率很差,或在表中检索对象很困难
O-R映射(ORMapping):
用户开发和维护的中间件层,该层负责将对象数据映射到关系数据库的表中。系统中其他模块可以通过OR映射层以操作对象的方法操作关系表中的数据。
(没有改变数据库的本质)
面向对象模型OODB:用面向对象数据模型代替关系数据模型。
- 复杂对象构造能力使得对于客观世界的模拟能力强,方式自然。
- 封装性向开发人员和最终用户屏蔽复杂性和实现细节。
- 继承性使得数据库设计和应用编程成为可重用的。
对象关系模型ORDB:将关系数据模型扩展为对象关系数据模型。
对象关系模型
- 特点:
- a.通过引入面向对象及处理复杂数据类型的构造来扩展关系数据模型.
- b.允许元组属性具有复杂类型, 包括非原子值(如嵌套关系).
- c.保持关系基础, 尤其是对数据的描述性存取, 同时扩展建模能力.
- d.与现有关系语言向上兼容.
违反第一范式
对象在其REF类型的属性中存储所关联的对象的OID值,实现对其它对象的引用
ORDB 对象-关系数据库是发展趋势
集合模型
-
关系模型:
- 把要存储的信息划分成元组(行)
- 元组是受限的数据结构
- 获得一组值
- 不能把一个元组嵌套进另一个元组,也不能把一个表中的元组放进另一张表
- 允许把数据操作看成具有输入元组和返回元组
-
集合模型:
- 意识到用户想要操作比元组更复杂的数据单元
- 复杂记录允许List,Map,以及其他嵌套在内部的数据结构
- 键值对、文档、列族数据库使用这种复杂的结构
- 一个集合是我们想要作为数据操作单元并管理一致性的相关对象集合
- 采用原子操作更新集合
- 用集合合数据存储通信
- 这个定义与键值对,文档和列族数据库工作。
- 使用集合,我们可以更容易地在集群上工作,因为它们是复制和共享的单元。
- 由于解决了关系数据库的阻抗失配问题,聚合程序也更易于应用程序员工作。
不可分配存储
集合模型关系映射可以很好地捕获数据元素和它们之间的关系。
因为它使用外键,所以它不需要任何集合实体的概念。
无法从代表集合的关系中分辨出来
因此,我们不能利用这些知识来存储和分发数据。
键值数据库&文档数据库
-
相同:都面向集合、都包含大量含键的集合
-
区别:
- 键值存储的集合不可见、文档存储的集合可以看到结构
- 键值数据库的优势是可以存储任何类型的对象、文档存储对可以存储的内容有限制,对数据有结构定义,可以用一种语言查询文档
- 键值存储只能通过键访问、文档存储可以提交基于字段的索引,可以检索部分集合,数据库可以创建基于集合字段的索引
- 文档存储可以当键值来用
Riak(key-value)允许向集合添加用于索引的元数据
Redis允许把集合拆分成lists,sets,maps
使用键值存储期待集合使用键
使用文档存储期待对文档内部结构提交某种形式的查询
止于 先进数据库技术03 P57
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
面向练习
关系代数
-
查询最多选修了一门其直接先行课为5号课程的学生姓名。
-
思路:最多选修一门的学生=全体学生-选修>=2门的学生。
一个表:>=1,至少1,主要的表和联系的表做笛卡尔积即可
两个相同的表笛卡尔积:>=2,至少2
n个相同的表笛卡尔积:>=3,至少3
-
X=先修课为5的课程号
Y=选修了X对的选课记录
Y1=Y,Y2=Y
Y1 X Y2 结果是:
-
-
查询至少选修了一门其直接先行课为5号课程的学生姓名。
至少1门,自然连接有结果即可
ΠSname(σCpno=5(COURSE) JOIN SC JOIN STUDENT)
-
查询选修了全部课程的学生号和姓名
“全部”、“所有”、“至少”对包含(A、B、C)在内/对所有的(A、B、C)的 一般用除法
(ΠCno,Sno(SC)➗ΠCno(COURSE)) JOIN ΠSno,Sname(STUDENT)
面向往年题
recovery
Undo日志规则:(刷新日志、output、commit)
- 若事务T要修改数据库元素X(旧值OLD),把<T, X ,OLD>写入磁盘undo-log,然后再把新值new写入磁盘(先刷新日志,再OUTPUT)
- 若T提交了,先把把所有修改了的页表元素写入磁盘,然后将< COMMIT T >写入磁盘undo-log(先OUTPUT,再写commit)
redo日志规则:(刷新日志、commit、output)
- 如果事务T要修改数据库的元素X,新值设为new,那么将< T X new >写入redo-log
- 如果事务T提交了,先把< COMMIT T>写入redo-log磁盘,然后才能把新值写入磁盘
undo/redo 日志规则:(刷新日志、commit和output顺序随意)
- 若事务T要修改数据库元素X,旧值为old,新值为new,那么
- 将< T, X, old, new>写入undo/redo-log
- 日志记录必须比相应的修改页表先写入磁盘
- 事务提交时,把< COMMIT T>写入日志磁盘
- 修改数据库页表可以在commit之前也可以在之后
数据库恢复:
定义
面向对象模型和关系模型
关系模型:有限的数据类型;不能清晰表达复杂对象和对象之间的关系;缺少对象身份标识。
面向对象模型OODB:
事务
用户定义的一个数据库操作序列,要么全做,要么都不做,是一个不可分割的整体
数据库三模式
外模式、内模式、概念模式
SQL statement type
数据定义语言(DDL)定义数据库结构或表。
数据操作语言(DML)管理表对象内的数据。
数据控制语言(DCL)授予访问有限数据的权限
事务控制语句(TCS)将更改永久保存到数据库中。
会话控制语句(SCS)动态管理用户会话的属性。
base&ACID
361BASE
基本可用(Basically Available):系统能够基本运行、一直提供服务。
软状态(Soft-state):系统不要求一直保持强一致状态。
最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求。
Atomic原子性:事务中的操作要么全做要么都不做
Consistency一致性:在事务开始与结束时,数据库处于一致状态
Isolation隔离性:不同事物的操作不会影响
Duration持久性:在事务结束时,此操作将不可逆转
实体和属性确定原则
实体集设计原则:存在至少一个非主属性或是“一对多”关系中的多
属性:不再具有需要描述的属性、不能与其他实体相联系
different type of normalization
面向群聊
游标
- 游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。
- 概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。游标提供了在逐行的基础上操作表中数据的方法。
- 游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。