1、数据与其语义密不可分。
单单一条记录不能当作数据,并不知道每一部分是什么意思。有一个语义对每一部分进行解释,才能叫做数据。
2、数据库(Database,简称DB)是长期储存在计算机内、有组织的、可共享的大量数据集合。
长期:数据库在外存上,而不是内存上
有组织:数据结构,数据模型
可共享:有多个用户
3、对数据进行分类、组织、编码、存储、检索和维护,是数据处理的**中心**问题。
4、数据管理技术的发展过程:
人工管理阶段: 数据没有独立性,共享性,缺乏逻辑组织。(数据的独立是针对于应用程序而言,数据的结构化是针对于数据之间,数据的共享性是针对用户而言。)
文件系统阶段:独立性和共享性实现,但仍有冗余。(共享度低就会导致冗余多)
数据库系统阶段:数据结构化,共享度高,冗余度低易扩充,独立性高,实现对数据的统一管理。
5、数据库系统的特点:
数据独立性:高度的物理独立,一定的逻辑独立
数据结构化:数据模型
数据共享性:共享性高,冗余度低,易扩充
数据库的统一管理和控制:通过DBMS
6、数据结构化是数据库系统与文件系统的本质区别。
7、数据的独立性就是数据能否独立于应用程序存在,比如应用程序是否需要自己定义数据、存储数据,更改数据之后应用程序是否需要重构;数据的结构化就是数据不再针对某一应用,而是面向整个组织的,描述数据的时候不仅仅是数据本身,还要描述数据之间的关系,“外码”;数据的共享度就是数据结构化、独立性高,那么就可以被多个用户、应用来共享,与此同时也可以实现冗余的减少,避免数据之间的不相容性和不一致性。
1、数据模型是数据库系统的核心与基础。
2、数据模型分为概念模型与物理模型。
三要素
关系模型
1、数据模型里有型与值的概念。模式是对型之间关系的描述,具体赋值后成为模式的实例。学生选课是一个模式,但每年的具体课程与学生并不相同,因此每年的数据都是一个实例。模式是稳定的,实例是变动的。
2、三级模式结构
3、二级映像
1、硬件存放数据库
2、软件
3、DBA,系统分析员,数据库设计人员,应用程序员,用户
1、DBA不负责模式设计,数据库设计人员负责
2、物理独立性体现在不会因为系统数据存储结构变化而影响到应用程序
3、文件系统阶段,有专门的软件对数据进行管理——文件系统。
4、DBMS功能
5、数据库中的数据按一定的数据模型组织描述和存储。
6、描述事物的符号记录叫做数据
7、数据字典不仅存储数据对象的描述信息,还存储DBMS的控制信息。
8、文件系统只是实现了应用程序与数据的分离,实质上造成了文件与数据的联系,文件之间依然独立,文件与数据一一对应。
9、层次模型的数据结构是树,网状模型的数据结构是图。
10、表达业务流程分析结果的图表是数据流图.
11、数据库中对数据的操作可以以数据项为单位,也可以以记录为单位。
1、关系有三种类型:基本类型,查询表,视图表。
2、关系的每一个分量是一个不可再分的数据项。
3、关系模式是型,关系(表)是值。
R ( U , D , D O M , F ) R(U,D,DOM,F) R(U,D,DOM,F)
R为关系名,U为属性名的集合,D为域的集合,DOM属性向域的映射(说明每个属性对应哪个域),F是属性之间的依赖。
4、模型的命名就是以数据结构命名。所以,关系模型的数据结构就是关系,网状模型的数据结构就是网。
5、视图是一个虚表,它是从一个或几个基本表中导出的表。在数据库中,只存放视图的定义,不存放视图的 对应的数据。
实体完整性和参照完整性是关系必须满足的两个条件,是关系的两个不变性。
1、实体完整性:主属性不能为空值。
2、参照完整性:外码要么为空值,要么能对应上被参照关系的主码。
3、用户定义完整性:应用程序的语义限制。(数据类型,int,varchar等等)
1、选择,投影,连接,除
2、悬浮元组:没有对应的而被舍弃的元组。如果将其他属性填上空值,悬浮属性依然保存在结果里,就叫外连接。保存左边关系的悬浮数组叫左外连接,右边的右外连接。
3、出大题
出现“所有”,”至少“,想到除法
最后要什么,先在前面写投影
可以按照查询树的思路写
除法注意先投影,只保留需要的以及除法要的,否则会影响答案。
比如S(A,B,C),D(B),我想保留A,如果直接
S ÷ D S\div D S÷D
那么计算的时候(A,C)成了一对,很可能本来A够的,因为C的不同不够了。
Π A , B ( A ) ÷ D \Pi_{A,B}(A)\div D ΠA,B(A)÷D
这样的话,就避免了上面所说的问题。
还有除法后面的也要投影。比如S(A,B),D(B,C)的情况,要把后面的C去掉。
4、关系数据库中基于数学上两类运算是关系代数和关系演算 。
5、看清笛卡尔积和自然连接符号。
6、除是关系运算符,不是传统集合运算符。
7、五种基本运算:并差笛卡尔积选择投影
1、判断空值不要用“=”,用 is null/is not null
2、除了where的时候,select/group by/order by也要注意属性名要唯一。比如前面自然连接
where sc.sno=course.sno
那么后面
group by sc.cno
而不能
group by cno
3、默认升序,order by 后加 desc 降序。
4、使用AVG,MAX,MIN等聚集函数的时候,即便是group by cno,只要cno和cname也是一一对应的,那么就可以select cname。
5、建立视图的时候记得写列名
create view VSC(Sno,Sname Gavg)//✔
as ...
create view VSC//❌
as ...
6、where多个条件的时候,别忘写and
7、count(*)是计算元组的个数,不会忽略元组的null值。
8、删除的时候注意顺序!!!!!!!!!!先删除有外码的,再删除那个主码的。
9、删除表中所有数据≠删除表
1、数据保护包括数据的安全性和完整性。安全性是指保护数据库以防止不合法使用所导致的数据泄露、更改或破坏。
2、自主存取控制DAC,强制存取控制MAC
1、用Grant语句赋用户权限
grant后加各种权限,select,insert,update(Sno),delete,all privileges是指所有权限。
table后面加表名,可以写多个表,用逗号隔开。
to后面加用户,可以多个用户,用逗号隔开,public代表所有用户。
with grand option代表被授权的用户可以将自己的被赋的权限赋给别的用户,没有with grand option则只能使用权限,不能再给别人。但是被授权着不能授权给祖先。
Grant all privileges
on table xxx
to public
with grand option;
2、用revoke收回用户权限
revoke后面加权限名,table后面加表名,from加用户名。cascade代表收回stu1给别的用户的select sc的权限(以stu1为根的这一棵授权树全部消失)。但是,当stu1和stu2都给stu3同一权限后,收回stu1的权限时,同时收走了stu1给stu3的,但因为stu2给stu3的并不消失,stu3仍可以使用该权限。
revoke select
on table sc
from stu1[cascade|restrict];
3、create user
在create user的时候,可以规定user是否可以create scheme,create table/view。
不写with以及以后的默认创建connect的。
connect被grant什么权限后才可以做对应的事情。
resource可以create table/view,并且为自己table/view的属主,可以给别的用户权限。
dba拥有所有权限,只有dba可以create scheme,create user。
create user username with [dba|resource|connect];
4、create role,grant role
如果想给一批人同样的权限,一个个太慢了,使用role来规定一个“角色”都有哪些权限,相当于模板。
对于role的grant,revoke与user类似,role可以grant给别的role或者user,with admin option意味着接收者可以再把role给grant下去。
create role rolename;
grant select,insert,delete
on table tablename
to rolename1;
grant rolename1
to rolename2,user2
[with admin option];
revoke select,insert,delete
on table tablename
from rolename;
revoke rolename
from username;
1、主属性是候选码里的所有属性,而不是主码的。
2、传递依赖,中间的Y要不函数依赖于X,否则是Z直接函数依赖于X,并不经过Y。
3、问题
1、判断的时候注意是“非主属性”,不是属性;以及对“候选码”,任意一个候选码都算满足条件(也意味着要找全候选码)。
2、即便是没有非主属性,也可能被依赖属性并不是候选码,导致不是BCNF。
3、规范化的基本思想是消除关系模式中不合适的数据依赖(不要少写成函数依赖)
1、闭包不要忘了自己 B + = B B^+=B B+=B,自身一定在闭包里面。
1、只保持函数依赖,总可以到达3NF,不一定可以到达BCNF;
所以BCNF的模式分解是“分解成BCNF且保持无损连接”,不说函数依赖的事情。在分解的时候, A → B A\rightarrow B A→B分解成 ( A B ) , ( U − B ) (AB),(U-B) (AB),(U−B),在 ( U − B ) (U-B) (U−B)中是一定存在 A A A的,所以怎么分解都可以保证无损连接,一定可以一个一个属性的对应上;但是在分解时候,忽略了 ( U − B ) (U-B) (U−B)中其他属性有关 B B B的依赖,比如 C → B C\rightarrow B C→B就会丢失。
2、既要保持函数依赖,又要无损连接,可以达到3NF,但不一定能达到BCNF;
3NF在保证函数依赖的时候将所有不出现在F的属性存在一起,这一部分会丧失无损性,因为之后不知道它们跟谁有依赖;但在之后去保持无损连接的时候,这些不在F里的一定是主属性,添加一个主码就是为了解决他们。
3、只要求无损连接,那一定可以达到4NF。
4、BCNF分解不需要最小依赖集,因为在过程中不需要保持函数依赖。
5、BCNF分解出一个后,做投影时要用Armstrong公理系统,因为是 F + F^+ F+。
1、外码是针对指向别的关系的关系模式的。比如,A(S,D),B(D,V),B的D是主码,那么D是A的外码。
2、最小依赖集需要必要的判断冗余过程,不要直接写答案。
3、判断有无损连接性,先写一个最初的分解的表格,再写一个最后的表格,说明有“全a一行出现”,所以保持无损连接。判断有无函数依赖,写每一个分解上 F F F的投影,然后说明KaTeX parse error: Undefined control sequence: \or at position 4: F_1\̲o̲r̲ ̲F_2\or F_3\or \…。注意写投影的时候不要用Armstrong公理系统,但是拿回去等价的时候可以用。
4、BCNF分解的时候,比如A→B,A→D而A不是主码,那么分解的时候分解成(ABD),不要分解成(AB),(AD)
5、看清最高范式最高达到还是最少达到。
1、E-R图转关系模式
1:1关系 合并到一边的关系模式里,或者新建一个
1:n关系 将“1”的主码放进“n”的关系模式里
m:n关系 新建一个关系模式,主码为两端关系模式的主码
2、如果题上告诉了都有什么联系,就不要自己去加联系,哪怕符合逻辑。
3、不要想当然,有些是联系建立才有的属性不要在E-R图上直接画到实体里。班级作为实体,只有与学生实体联系之后才会有人数的属性。
1、写代码的时候不需要考虑执行效率,DBMS会自己来选择最有查询结果。
2、查询优化的一般准则:
3、关系表达式的优化算法
4、实例
例一:查询所有选修了2号选修课的学生姓名
select name
from student,sc
where student.sno=sc.sno
and sc.sno=2;
查询语法树
将连接运算转换为带选择的笛卡尔积运算。
将sc.sno=2往叶子转移
查询选修课程名为DB的成绩在85分以上的女学生的姓名。
Π s n a m e ( σ s s e x = ′ 女 ′ ( S t u d e n t ) ⋈ σ g r a d e > 85 ( S c ) ⋈ σ C n a m e = ′ D B ′ ( C ) ) \Pi_{sname}(\sigma_{ssex='女'}(Student)\bowtie\sigma_{grade>85}(Sc)\bowtie\sigma_{Cname='DB'}(C)) Πsname(σssex=′女′(Student)⋈σgrade>85(Sc)⋈σCname=′DB′(C))
转换为
1、数据库的恢复与数据库并发控制均属于事务处理技术。以事务为基本操作单位。
2、事务:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
3、显式定义事务
begin transaction
sql
sql
sql...
commit|rollback
commit事务正常结束,提交事务所有操作(读+更新),更新永久生效。
rollback事务异常终止,回滚所有更新操作,回到开始前的状态。
4、事务的特性
1、恢复原理:冗余
2、恢复数据的关键问题:
3、数据具有不一致是因为数据库具有冗余。
1、后备副本。
2、静态转储:系统不运行事务时进行。
动态转储:转储操作与用户事务并发进行。 不能保证副本的数据正确有效。
海量转储:每次转储全部。 恢复方便。
增量转储:只转储更新的数据。 大数据库更加实用。
3、DBA根据数据库使用情况确定适当的转出周期与方法。多种方法都用,而不是只用一个方法。比如:每天晚上动态增量,每周动态海量,每月静态海量。
1、日志文件:记录事务对数据库更新操作的文件。
2、日志文件格式:以记录为单位,以数据块为单位。
3、文件内容:事务开始结束标志,每个事务的所有更新操作,与事务有关的内部更新操作。
4、原则:
输入数据错误,运算溢出……
恢复子系统利用日志文件撤销已有的修改。反向扫描文件日志,查找事物的所有更新操作,将更新前的值写入,直到读到事务的开始标志。Undo。
DBMS自动执行。
正在运行的事务全部终止,内存缓冲区数据丢失,外存不受影响。停电,DBA操作失误……
Undo故障发生时未完成的事物,Redo已完成的事务。
DBMS重启时自动执行。
硬件发生故障。磁盘损坏,瞬间强磁场干扰。
重装数据库(恢复到一致性状态),重做已完成的事务。Redo。
1、单处理机并发执行方式:交叉并发方式。
多处理机并发执行方式:同时并发方式。
2、并发执行可能破坏原子性、隔离性、一致性。(不会破坏永久性)
3、并发控制机制是衡量一个DBMS的重要标志之一。
1、丢失修改
事务1和事务2先后读取数据,先后修改数据,1的修改被2覆盖。
2、不可重复读
事务1读取数据后
事务2删除了部分数据,事务1发现神秘记录消失
事务2增加了部分数据,事务1发现多了一些记录
后两种也叫做”幻影现象“。
3、读“脏“数据
事务1修改数据后,事务2读取该数据,但是事务1发生回滚,数据恢复,此时事务2的数据变成”脏“数据。
(分清不可重复读与读”脏“数据,不可重复读要先有”重复读“,比如验算操作。)
1、对某个数据操作之前,对该数据对象加锁。
事务T给数据对象A加上X锁之后,只有事务T可以对数据对象A操作。
事务T给数据对象A加上S锁之后,其他事务只能对A加S锁,而不能加X锁。
三级封锁协议
1级封锁协议
事务T在修改数据R之前必须先对他加X锁,直到事务结束才释放。
避免丢失修改,但因为读数据没有加锁,所以不可以避免 不可重复读与读”脏“数据。
2级封锁协议
读前加S锁,读后释放。
避免丢失修改和读”脏“数据,但不能保证可重复读。
3级封锁协议
1级封锁协议+读前加S锁,事务结束后释放。
三个问题都可以解决。实际上就是串行了。
1、同操作系统死锁与活锁。
2、“预防”活锁的方法:按时间调度。
3、死锁的预防:
4、死锁的诊断与接触:超时法,等待图法。
1、可串行性是并行事务正确性的唯一准则。
2、保证并发操作调度正确性的方法:
封锁方法:两段锁协议
两段锁协议是可串行化调度的充分条件,但不是必要条件
1、数据共享与数据一致性是一对矛盾。
2、并发控制机制→并发控制程度→数据的共享性→数据库的价值
并发控制机制→数据一致性(控制越多,一致性越好)
3、数据库系统得并发控制的主要方法是采用封锁机制