数据库:长期存储在计算机内、有组织的、可共享的、大量的数据集合
比较:
文件系统:文件存储,数据面向对象是某个应用
- 数据依赖、相关性:每个程序都要维护它们使用的文件的元数据
- 数据冗余:不同系统或程序有相同数据的不同副本,多种文件格式的信息重复
- 有限的数据共享,没有数据的集中控制
- 漫长的开发时间,每个新的应用都要重新设计文件
- 程序维护过度
- 数据访问困难
- 完整性问题,难以添加新约束或改变现有约束
数据库系统:用于大规模数据管理,有数据库管理系统,处理方式包括联机实时处理、分布处理、批处理,数据面向对象是现实世界(如一个企业、跨国公司)。
- 数据共享、冗余少、数据-程序独立、方便的程序接口、数据访问高效、数据完整性和数据安全、并发管理
- 结构化数据存储,自动管理数据关系
核心内容:数据模型
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
通常将权限与视图联合起来使用,控制用户的子模式,实现数据的安全性控制。
备份恢复
- 撤消日志记录
- 输出OUTPUT必须早于
- 如果看到,则T肯定已将其所有数据写入磁盘(因此,不需要撤消)
- 重做日志记录
- 输出OUTUT必须晚于
- 如果没有看到,则T肯定没有将任何数据写入磁盘(因此磁盘上没有脏数据)
可以早也可以晚
最后两节课:非关系型数据库,了解关系数据库面临的挑战;存对象,解决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 | 封锁协议 |
02Data Model P33
避免冗余、可以用属性时不要用实体
实体集至少满足:
属性满足:不再具有需要描述的属性、不能与其他实体相联系
一个键可以由多个属性组成
超级键:一个或多个属性的集合,其值唯一地决定每个实体。
候选键:最小超级键
主键:选择一个候选键作为主键。
ER模型 关系模型
实体集E=关系的属性是E的属性
关系R=关系R的属性+相关实体的键
域完整性约束:加在属性的值上
实体完整性约束:由主键定义(唯一、非空)
引用完整性约束:要求关系(表)的一个属性(列)的每个值作为另一个属性的值存在于不同(或相同)的关系(表)中
unique key:可唯一标识表中每一行,允许空值,可以有多个
Binary operations 二元运算
Unary operations一元操作
Derived RA Operations派生操作
intersection交:输入schema相同的两张表,R1∩R2 = R1 - (R1 - R2)
join(连接)
θ连接:连接效果是对笛卡尔积的结果做选择
自然连接
符号: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)
关系代数允许我们以自然的方式表达操作序列,局限是不能计算传递闭包。
3方面内容:函数依赖、范式、模式设计,函数信赖起着核心的作用,是模式分解和模式设计的基础,范式是模式分解的标准。
关系模式中的各属性之间相互依赖、相互制约的联系称为数据依赖。数据依赖一般分为函数依赖、多值依赖和连接依赖。函数依赖是最重要的数据依赖,分为完全函数依赖、部分函数依赖、传递函数依赖;
平凡函数依赖:子集关系,不说明时讨论非平凡函数依赖。
只能根据语义来确定一个函数依赖,而不能按照其形式化定义来证明一个函数依赖是否成立。反映了一种语义完整性约束。函数依赖关系的存在与时间无关。
函数依赖可以保证关系分解的无损连接性。
函数依赖基本性质
完全函数依赖,X决定Y,X的任意真子集不决定Y
求最小函数依赖 (09逻辑结构设计P74)
规范化实质是“单一化”的“一事一表”原则
考虑非规范化处理的情况
大量频繁的查询过程所涉及的表都需要进行连接;
主要的应用程序在执行时要将表连接起来进行查询;
对数据的计算需要临时表或进行复杂的查询。
非规范化设计的主要优点
非规范化存在的主要问题
非规范化设计的管理最好用触发器实现
包括结构设计(静态模型设计)和行为设计(动态模型设计)
新奥尔良法将数据库设计分成需求分析(分析用户需求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。
数据库设计过程:新奥尔良法+数据库实施+数据库运行维护
设计方法
基于E-R模型的数据库设计方法
基于3NF的数据库设计方法
确定数据库模式中的全部属性和属性间的依赖关系,将它们组织在一个单一的关系模式中,然后再分析模式中不符合3NF的约束条件,将其进行投影分解,规范成若干个3NF关系模式的集合。
(1)设计企业模式,利用规范化得到的3NF关系模式画出企业模式;
(2)设计数据库的概念模式,把企业模式转换成DBMS所能接受的概念模式,并根据概念模式导出各个应用的外模式;
(3)设计数据库的物理模式(存储模式);
(4)对物理模式进行评价;
(5) 实现数据库。
基于视图的数据库设计方法
将需求分析阶段得到的用户需求抽象为信息结构即概念模型的过程。
步骤:
数据模型优化:1.确定数据依赖 2.对数据依赖进行极小化处理,消除冗余联系 3.按照数据依赖理论对 关系模式逐一分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各个模式的范式 4.针对应用环境分析是否需要分解合并
分解
设计用户子模式
primary和unique
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规则
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;
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 ;
如果两个事务发生冲突,我们从Ti到Tj画一条弧线,并且Tj访问了之前发生冲突的数据项。
当且仅当调度的优先级图是非循环的时,调度是可冲突序列化的。
如果优先图是非循环的,则可通过对图的拓扑排序得到可序列化次序。下图的序列化顺序可以是T5->T1->T2->T3->T4
事务分为两个阶段:
第一阶段是封锁,也称为扩展阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁;
第二阶段是释放封锁,也称为收缩阶段,事务可以释放任何数据项上任何类型的锁,但是不能申请任何锁;
事务的基本操作:
INPUT(X)->READ(X,t)->WRITE(X,t)->OUTPUT(X)
读取X到内存缓冲区->把X拷贝给事务局部变量t->把事务局部变量t拷贝给X->把X写进磁盘
日志是一个只能添加,的含有日志记录的文件,多个事务并发执行时日志记录是交叉存的
系统崩溃后,使用日志 重做一些未提交的事务/撤销其他没有提交的事务
登记日志文件时必须遵循两条原则:登记的次序严格按并发事务执行的时间次序;必须先写日志文件,后写数据库。
记录:
事务T开始
事务T提交
事务T中止
撤销日志规则:
1.如果事务T修改了X,那么
2.如果事务T提交,那么必须在所有事务T要执行的修改执行之后再写入磁盘
因此,输出是早期完成的(相比commit)
撤销的恢复步骤:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1THSCtS-1626501451791)(img/数据库复习之ppt_img/1426807-20180622213700903-485356098.png)]
注:undo操作是幂等的,可以多次执行,所以如果恢复时系统崩溃,只需再执行一遍恢复;
日志文件需要读完整,效率低,可以用检查点标志来提高效率;
重做日志规则:
如果事务T修改了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,则
修改后的规则对输出相对于commit的时间没有要求,可以在commit之前输出,也可以在commit之后输出
系统的恢复步骤:
1.扫描日志文件,确定每个事务是否完成(commit, abort都算完成),在故障发生前已经结束的事务记入重做序列,未完成的事务记入撤销队列
2.对撤销队列中的每个事务执行撤销(按照从后到前的顺序)
3.对重做队列中的每个事务执行重做(按照从前到后的顺序)
关系模型缺点:
用关系数据库存取对象,阻抗失配(Impedance mismatch)问题
对象映射到表的困难:对象含有复杂结构;存在大的非结构化的对象;存在类继承;映射结果可能:会导致:表存取的效率很差,或在表中检索对象很困难
O-R映射(ORMapping):
用户开发和维护的中间件层,该层负责将对象数据映射到关系数据库的表中。系统中其他模块可以通过OR映射层以操作对象的方法操作关系表中的数据。
(没有改变数据库的本质)
面向对象模型OODB:用面向对象数据模型代替关系数据模型。
对象关系模型ORDB:将关系数据模型扩展为对象关系数据模型。
对象关系模型
违反第一范式
对象在其REF类型的属性中存储所关联的对象的OID值,实现对其它对象的引用
ORDB 对象-关系数据库是发展趋势
集合模型
关系模型:
集合模型:
不可分配存储
集合模型关系映射可以很好地捕获数据元素和它们之间的关系。
因为它使用外键,所以它不需要任何集合实体的概念。
无法从代表集合的关系中分辨出来
因此,我们不能利用这些知识来存储和分发数据。
键值数据库&文档数据库
相同:都面向集合、都包含大量含键的集合
区别:
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)
Undo日志规则:(刷新日志、output、commit)
redo日志规则:(刷新日志、commit、output)
undo/redo 日志规则:(刷新日志、commit和output顺序随意)
数据库恢复:
关系模型:有限的数据类型;不能清晰表达复杂对象和对象之间的关系;缺少对象身份标识。
面向对象模型OODB:
用户定义的一个数据库操作序列,要么全做,要么都不做,是一个不可分割的整体
外模式、内模式、概念模式
数据定义语言(DDL)定义数据库结构或表。
数据操作语言(DML)管理表对象内的数据。
数据控制语言(DCL)授予访问有限数据的权限
事务控制语句(TCS)将更改永久保存到数据库中。
会话控制语句(SCS)动态管理用户会话的属性。
361BASE
基本可用(Basically Available):系统能够基本运行、一直提供服务。
软状态(Soft-state):系统不要求一直保持强一致状态。
最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求。
Atomic原子性:事务中的操作要么全做要么都不做
Consistency一致性:在事务开始与结束时,数据库处于一致状态
Isolation隔离性:不同事物的操作不会影响
Duration持久性:在事务结束时,此操作将不可逆转
实体集设计原则:存在至少一个非主属性或是“一对多”关系中的多
属性:不再具有需要描述的属性、不能与其他实体相联系