数据库原理
1,概念介绍
数据库(Database):有组织、冗余度小,可共享、 数据独立性高、易扩展的数据集合。
数据库管理系统(DBMS):位于用户与操作系统 之间的一层数据管理软件,用于组织、存取和维护数据。有时也被直接称为数据库系统。
DBMS的基本功能:
数据库定义;数据存取;数据库运行管理;数据组织、存储和管理;数据库的建立和维护网络通信、数据转换、异构数据库互访。
数据库的三级抽象:视图层、逻辑层、物理层;他们分别对应着外模式、模式、内模式。
外模式 (External Schema):是数据库用户的数据视图,是与某一应用有关的数据表示;
一个数据库可有多个外模式。
模式(Schema):逻辑级上的视图,是数据库中全体数据的逻辑结构和特征的描述;
一个数据库只有一个模式。
内模式 (Internal Schema):数据物理结构和存储方式的描述,是数据在数据库内的表示方式;
一个数据库只有一个内模式。
![image-20210104141358485](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210104141359.png)
数据独立性:
物理独立性——当内模式变化时,模式和应用程序不改变;
逻辑独立性——当模式变化时,外模式和应用程序 少或不改变(应用程序依赖于模式)。
三级模式结构及二级映像实现了数据库系统的数据独立性。
![image-20210104142633810](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210104142649.png)
2,关系模型
数据模型描述三大要素
数据结构(数据,数据间的联系等)
数据操作(操作类型、操作方式等)
约束条件(数据的语义,数据间的约束等)
数据建模的基本过程:概念模型-逻辑模型-物理模型。
2.1,关系运算符:
用传统的集合运算和专门的关系运算来表达查询的抽象语言。
![image-20210104191752692](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210104191754.png)
选择关系:选择运算是从行的角度进行的运算,是从关系R中选取使逻辑表达式F为真的元组;
投影关系:投影运算是从列的角度进行的运算,但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行);
连接关系:
等值连接,即我们最常使用的“=”进行的运算;
自然连接,要求比较的分量必须是相同的属性组,并在结果中去掉重复的属性;
半连接,R和S自然连接后仅保留对R属性的投影
外连接:R和S自然连接时,对不匹配的元组用空值来表示,有左外连接,右外连接,全外连接之分。
R和S左外连接,R和S自然连接并保留R的所有元组信息,没有匹配的用空值表示;
R和S右外连接,R和S自然连接并保留S的所有元组信息,没有匹配的用空值表示;
R和S全外连接,R和S自然连接并保留R、S的所有元组信息,没有匹配的用空值表示。
除关系:R÷S表示R在行匹配且列匹配S后的元组。
2.2,集合运算符
并 ∪ \cup ∪,差-,交 ∩ \cap ∩,笛卡尔积
R
∪
\cup
∪S:其结果仍为n目关系,由属于R或属于S的元组组成,对应sql为union
;
应用场景,一般是多个语句的并,相当于执行了多个条件;
R-S:其结果仍为n目关系,由属于R而不属于S的元组组成,对应sql为except
;(mysql不支持)
R
∩
\cap
∩S:其结果仍为n目关系,由既属于R又属于S的元组组成,对应sql为intersection
;(mysql不支持)
笛卡尔积:关系R和S的笛卡儿积是一个(n+m)列的元组的集合,其中前n列是关系R的一个元组,后m列是关系S的一个元组。若R有x个元组,S有y个元组,则关系R和S的笛卡儿积有x*y个元组。
直接做笛卡尔积产生了许多没有意义的元组,往往做自然连接会得到想要的结果。
select attribute from table1,table2;(默认就是笛卡尔的方式)
select attribute from table1 cross join table2;
demo:
![image-20210104212319762](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210104212321.png)
#2,查询Kim老师的办公地点;
#这里使用了`ρ i instructor`设置别名的方式,
#法一,先使用笛卡尔积,再以部门相同为依据找出匹配部分
π d.building (σ i.name = 'Kim' and i.dept_name = d.dept_name (ρ i instructor ⨯ ρ d department))
#法二,作自然连接,直接得到匹配的数据
π d.building (σ i.name = 'Kim' (ρ i instructor ⨝ ρ d department))
#4,查询database课程成绩在90分以上的学生信息;
π s.name (σ (c.title = 'database' and t.grade > '90') (ρ t takes ⨝ ρ c course ⨝ ρ s student))
#5,查询没有选修任何课程的学生信息
π b.ID,b.name σ a.ID = b.ID ((ρ a (π ID student) - (π ID takes)) ⨯ (ρ b student))
3,SQL语言
SQL(Structured Query Language),即结构化查询语言,是关系型数据库的标准语言。
分类
DDL(Data Definition Language):数据定义语言
create,drop,alter等,定义关系模式、属性域、完整性约束、索引、视图等
DML(Data Manipulation Language):数据操纵语言
select,insert,delete,update
DCL(Data Control Language):数据控制语言
grant,revoke
常见数据类型
3.2,其他常见结构
视图:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
create view view_name as sql;
#调用
select view_name;
存储过程:预先写好的sql语句对某种功能的封装,创建时就就行一次编译,后续调用直接执行无需编译,效率很高。
create procedure procedure_name(in attribute char(6))
begin
sql语句;
end;
#调用
call procedure_name(value);
索引:索引的创建会提高查询效率,因为他将全表扫描的方式改为了列扫描。但过多的索引也会有效率问题,索引的执行和维护本身就会有资源开销。
create index index_name on table(attribute);
触发器:自动执行某种事件。但尽量不要使用,因为:触发器对表的每一行都会处理一个事务,有性能风险;触发器对应用程序透明,容易被开发者忽视。
#创建一个索引器,在删除学生后,删除其对应的选课信息
create trigger trigger_delete after delete
on student for each row
begin
delete from takes where takes.ID not in
(select ID from student);
end;
4,数据库设计
4.1,数据表结构
元组:二维表中的行; 属性:二维表中的列。
超键(Surpkey) | 能唯一标识元组的一个或多个属性的集合 |
---|---|
候选键(Candidate Key) | 不含多余属性的超键 |
主键(Primary key) | 用户选作元组标识的候选键 |
外键(Foreign key) | 对于当前模式而言,是另一模式下的主键。 |
主属性 | 构成候选键的属性 |
具体来说,一个关系中r(id,name),(id,name)可以是一个超键,而id是一个候选键。候选键可以有多个,而主键只有一个。
简单的情况下,候选码只包含一个属性。最坏情况下,关系模式的所有属性是这个关系模式的候选码,称为全码。
4.2,关系数据库逻辑设计
关系模式由五部分组成,是一个五元组: R(U, D, DOM, F)
关系名R是符号化的元组语义
U为一组属性
D为属性组U中的属性所来自的域
DOM为属性到域的映射
F为属性组U上的一组数据依赖
由于D、DOM与模式设计关系不大,因此我们主要把关系模式看作一个三元组:R<U,F>。当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系。
数据依赖的主要类型:
函数依赖(Functional Dependency,简记为FD);
多值依赖(Multi-Valued Dependency,简记为MVD)。
4.2.1,函数依赖
定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。函数依赖普遍存在于现实生活中。
![image-20210106203551768](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106203553.png)
正如上面所说平凡函数依赖是必然存在的,所以我们只讨论非平凡函数依赖。
![image-20210106203946764](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106203951.png)
![image-20210106204357543](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106204359.png)
![image-20210106204445791](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106204446.png)
4.3,范式
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
![image-20210106204900632](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106204901.png)
1NF:关系中每个分量都是单值的和固定的,不可再分的。
比如1个属性列的值是固定的,也不能同时有两个值。
2NF:满足1NF,非主属性完全函数依赖于候选键。 即不存在非主属性部分函数依赖于码的情况
eg:如下关系模式:S-L-C(Sno,Sdept,Sloc,Cno,Grade), Sloc为学生的住处,并且每个系的学生住在同一个地方。S-L-C的码为(Sno,Cno)。
![image-20210106205413933](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106205415.png)
不满足2NF是要出问题的,比如:
插入异常
如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
删除异常
如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
修改复杂
如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化。
![image-20210106205857395](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106205858.png)
![image-20210106205923585](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106205924.png)
比如关系(学号、姓名、课程号、授课老师);授课老师依赖于课程号,课程号依赖于学号。
可改为:(学号、姓名)、(学号、课程号、授课老师);
3NF:满足2NF,消除非主属性对候选键的传递依赖。即没有非主属性依赖于除码外的其他属性
比如关系(学号、系名、系主任);学号->系名;系名->系主任;而3NF要求只能存在依赖于码的情况。
可改为:(学号、系名)、(系名、系主任)
4.4,函数依赖理论
![image-20210106220313873](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106220315.png)
![image-20210106220343114](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210106220344.png)
4.4.1,求属性集X关于函数依赖集F的闭包
- 令 X ( 0 ) = X , i = 0 X^{(0)}=X,i=0 X(0)=X,i=0;
- 求B,即在F中寻找尚未用过的左边是 X ( i ) X^{(i)} X(i)子集的函数依赖V→W ,并找出W中未出现过的属性集B;
- X ( i + 1 ) = B U X ( i ) X^{(i+1)}=BUX^{(i)} X(i+1)=BUX(i);
- 判断 X ( i + 1 ) = X ( i ) X^{(i+1)}=X^{(i)} X(i+1)=X(i)是否成立;
- 若相等或X=U,则X就是 X ( i ) X^{(i)} X(i);算法终止;
- 若否,则i=i+l,返回第(2)步。
![image-20201107212624421](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20201107212633.png)
4.4.2,求解最小函数依赖集
最小函数依赖集是指没有任何冗余的函数依赖集 。
![image-20201107213002825](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20201109151002.png)
算法:
1,将所有依赖右边均改为单值依赖;
2,去掉F中依赖左边的多余属性;
3,去掉多余依赖:从第一个开始如(X→Y),去掉它后求解 X + X^+ X+的闭包,看 X + X^+ X+中是否包含Y,包含则可去掉。
![image-20201107215535725](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20201109151009.png)
4.4.3,判断无损连接
已知关系模式R(A,B,C,D,E)和函数依赖集,F={A→BC, CD→E, B→D, E→A}。 如果将R分解为R1(A,B,C)和R2(A,D,E)
问: 该分解是否是无损连接的?
判断是否无损连接的算法:
根据模式和属性构建二维表,
1,如果属性是模式中的元素,则对应位置填充 a i j a_{ij} aij,否则填 b i j b_{ij} bij;
2,根据依赖集中的关系,逐一更新二维表中的值:
首先找到对应某一列具有相同值的那些行,观察这些行中的列元素,如果有aj,全部置为aj,否则置换为bij;
重复对所有关系进行上述操作,直到二维表中某一行达到a1a2…aj的形式,说明为无损分解,退出算法。
模式|属性 | A | B | C | D | E |
---|---|---|---|---|---|
R1(ABC) | a1 | a2 | a3 | b14 | b15 |
R2(ADE) | a1 | b22 | b23 | a4 | a5 |
模式|属性 | A | B | C | D | E |
---|---|---|---|---|---|
R1(ABC) | a1 | a2 | a3 | b14 | b15 |
R2(ADE) | a1 | a2 | a3 | a4 | a5 |
无损的
候选码的求解:
5,事务
事务的概念:事务(Transaction)是数据库执行不可分割的基本单位,是恢复和并发控制的基本单位。
原子性(Atomicity):一个事务是不可分割的最小单位,要么全部执行,要么全部不执行;
一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。简单理解就是,事务在提交前所做的修改对其他事务是不可见的;
隔离性(Isolation):并发执行的各事务不能相互干扰,其对数据库的影响和它们串行执行时一样;
持久性(Durability):事务一旦提交,其对数据库的更新就是持久的,不再受后继操作或故障的影响。
![image-20210111164017625](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210111164027.png)
事务管理器:
将关于事务动作的消息传给日志管理器;
将关于何时可以或必须将缓冲区拷回磁盘的消息传给缓冲区管理器;
将数据库查询等操作消息传给查询处理器。
恢复管理器:
当系统崩溃时,恢复管理器被激活;
它检查日志并在必要时利用日志恢复数据·
日志管理器:
维护日志,记录所有对数据库的修改操作
必须与缓冲区管理器打交道,因为对磁盘的访问是通过缓冲区管理器来进行的
缓冲区管理器:
分配、管理和回收缓冲区;
决定何时将缓冲区的数据写回磁盘(立即修改/延迟修改)
完整性约束:实体完整性和参照完整性,用户自定义完整性。
实体完整性:数据库中数据必须满足的或约定的条件。比如主属性不能为空且唯一,又或者年龄不能为负数等。
参照完整性:是相对于两张表的引用关系而言的。
当参照完整性约束和实体完整性约束无法同时满足时,优先满足实体完整性约束。
![image-20210111170836984](https://cdn.jsdelivr.net/gh/hellolsk/imageSource//imageblog/20210111170842.png)