? 数据库系统(DataBase System,DBS)是采用了数据库技术的计算机系统,一般由数据库、数据库管理 系统(及相关使用工具)、应用系统、数据库管理员构成。
? 数据库系统是引入了数据库及时的计算机系统,一般由数据库,支持数据库运行的软硬件,数据库管理系统 (及其开发工具)、应用程序、数据库管理员和用户组成。
数据库系统的硬件平台及数据库:
软件:
人员:
? 数据库系统采用三级模式结构,三级模式之间形成了两级映像,从而实现了较高的数据独立柱(三级模式/ 两级映像)
? 三级模式:
* 外模式:也称为子模式或者用户模式,它是数据库用户(包括应用程序员和最终用户)看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集。一个数据库可以有多个外模式。外模式是保证数据库安全性的一个有力措施。由于它是用户的数据视图,如果不同用户在应用需求,看待数据的方式,对数据保密的要求等方面存在差异,则他们的外模式描述是不同的,既然数据是来自同一数据库,但在外模式中的结构、类型、长度、保密级等都可以不同。因此用户根据不同请求,看到的结果是不同的,并且每个用户看到的结果对应外模式中的数据,数据库中的其余数据对他们来说是不可见的。DBMS通过DML对数据记录进行操作
* 模式:模式也称为概念模式或逻辑模式,是数据库中全体数据的逻辑结构和特征描述,它是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,也与具体应用程序无关。模式实际上是数据库中数据在逻辑上的视图。一个数据库只有一个模式。数据库的模式以某一种数据模型为基础,同时考虑了所有用户的需求,并将这些需求有机地结合成一个逻辑整体。DBMS通过DDL定义数据的模式,同时还需要定义数据之间的联系及相关的安全性,完整性约束条件。
* 内模式:内模式也称为存储模式,它是数据物理结构和存储结构的底层描述,是数据在数据库内部的表示方式。例如,记录的存储方式是顺序存储、按照B+树结构存储还是按照Hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密;数据的存储记录有何规定等。一个数据库只有一个内模式。
? 两级映像:
创建表:
CREATE TABLE Student
(Sno CHAR(10) NOT NULL,
? PRIMARY KEY(Sno),
? Sname CHAR(10),
? Ssex CHAR(2),
? Sage INT,
? Sdept CHAR(20),
Foregin KEY(Sno) reference Student(Sno)
)
修改表:
ALTER TABLE Student
? ADD Room CHAR(8) NULL
ALTER TABLE Student
? ALTER COLUMN Room CHAR(6)
ALTER TABLE Student
? DROP COLUMN Room
删除表:
DROP TABLE Test[restrict|cascade]前者限制删除的表不能被其他表引用,如果存在依赖则不能删除。后者无限制,删除基本表的同时,相关的依赖依赖对象也会一起删除。
当“=”时连接运算称为等值连接。它是从关系R和S的广义笛卡尔积中选取A,B属性值相等的元组。
自然连接是特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性,并且在结果中把重复的属性列去掉。
一般连接运算是从行的角度进行运算的,但自然连接还需要去掉重复的列,所以同时从行和列的角度进行运算
自然连接和等值连接的差别如下:
选择、投影、并、交、差运算。交不是基本的关系代数运算,交可以被差运算取代。
关系模型中允许定义三类完整性约束:实体完整性约束,参照完整性约束,用户定义的完整性约束。其中实体完整性是规定表的每一行在表中是唯一的实体。参照完整性是指两个表的主关键字和外关键字的数据应该一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。这两个约束是由关系系统自动支持的。用户定义的完整性是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求;
select * :*表示所有列
视图(View)是从一个或者多个基本表(或视图)中导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。视图一经定义,就可以和基本表一样被查询,删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增删改)操作则有一定的限制。
对于视图需要注意的点:
(1)当基础关系发生变化后,再去访问视图,看到的虚拟关系也会发生相应的变化
(2)用户对视图的查询,系统在执行时必须转换为对基础关系的查询
(3)用户对视图的修改,系统在执行时必须转换为对基础关系的修改
视图的作用:
视图定义在基本表之上,对视图的一切操作最终也要转换为对基本表的操作。
用户对数据库最常用的操作之一就是查询数据。在数据量比较大时,搜索满足条件的数据可能会花费很长的时间,从而占用较多的服务器资源。为了提高数据检索的能力,在数据库中引入了索引的概念。数据库中的索引类似于书籍中的目录。在书籍中,利用目录,用户不必翻阅完整本书就能迅速地找到所需要的信息。在数据库中,索引使得不需要对整个表进行扫描,就可以在其中找到所需数据。
? CREATE [UNIQUE] [CLUSTERED] [NONCLUSTERED] INDEX <索引名>
? ON 表名 (<列名>[次序] [,<列名>[<次序>]]…)
注:如果没有指定索引的类型,则默认是创建非聚集索引。聚集索引和非聚集索引都可以是唯一索引。因此,只要列中的数据是唯一的,就可 以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引
? 数据库的安全性是指保护数据库以防止非法用户访问数据库,避免造成数据泄露,更改或破坏。
? (1)数据库遭到破坏
? (2)数据丢失
? (3)数据不一致
? (4)数据库管理系统故障
GRANT语句:
GRANT <权限名>[,<权限名>] on <对象> to <用户1>,<用户2>,…| PUBLIC [WITH GRANT OPTION]
例:
GRANT SELECT,UPDATE ON STUDENT TO LIMING WITH GRANT OPTION;
GRANT SELECT(Sno,Sname),UPDATE(Sname) ON STUDENT TO U5;
GRANT SELECT ON SC TO PUBLIC;
GRANT CREATE TABLE,CREATE VIEW TO LIMING;
GRANT ALL ON STUDENT TO LIFANG;
REVOKE语句:
REVOKE <权限名>[,…] ON <对象> FROM <用户1>,<用户2>,… | PUBLIC
例:
REVOKE UPDATE ON STUDENT FROM LIMING;
REVOKE SELECT ON SC FROM PUBLIC;
REVOKE CREATE TABLE FROM LIMING;
关系模式规范化的方法是进行模式分解,但是分解后产生的模式应与原模式等价;即模式分解必须遵守一定的准则,不能表面上消除了操作异常,却留下其他问题。模式分解需要满足以下标准:
(1)模式分解具有无损连接性
(2)模式分解能够保持函数依赖
无损连接是指分解后的关系与原关系相比,既不多出信息,也不丢失信息。保持函数依赖是指在模式分解的过程中函数依赖不能丢失的特性,即模式分解不能破坏原来的语义。为了得到更高范式的关系而进行的模式分解是否能够既保证无损链接又保持函数依赖呢?答案是否定的
对于无损连接分解就是不会丢失信息的分解,判定“一分二”是否无损链接的充分必要条件是,将关系R分解为R1和R2,则当以下两个函数依赖之一能够成立时,这种分解是无损的。
R1∩R2–>R1-R2
R1∩R2–>R2-R1
有关系模式R(C,T,H,R,S),函数依赖集为F={C–>T,HR–>C,HT–>R,HS–>R}。现在将R分解为两个关系,R1(C,H,S)和R2(C,T,H,R),这一分解是无损的吗?
解:是
R1∩R2=CH
R1-R2=S
R2-R1=TR
因为CH+=(CHTR),即CH–>TR成立
可以发现R1∩R2–>R2-R1,所以R分解为R1,R2是无损的。
worker(name,branch,manager)分解为w1(name,branch),b1(branch,manager)
W1∩B1=branch
W1-B1=name
B1-W1=manager
branch+=manager
W1∩B1–>manager,所以是无损连接
**第一范式1NF:**每个属性都是原子的关系是第一范式,也就是说关系的每个属性都是原子属性(属性值不可再分)。例如,年龄,性别是原子属性;父母是非原子属性。
必须将非1NF的关系变为1NF的关系,关键的方法是将表中每个非原子的属性转换成原子属性。包含多值属性的表规范成为第一范式的关系的处理步骤如下。
第一步:将多值属性从原表中移出
第二步:生成一个新关系,这个新关系同时还包含原来的主码,新关系的主码是原关系的主码与多值属性的组合
包含复合属性的表规范到第一范式的处理步骤比较简单,只要将复合属性转换成相应的多个原子属性即可
第二范式2NF:
若关系模式R(U,F)∈1NF,并且每一个非主属性都完全函数依赖于R的候选码。则R(U,F)∈2NF
判断是否属于2NF的方法是:是否存在某个非主属性,它部份依赖候选码,或者说依赖候选码的一部分,存在则不属于2NF,不存在则属于2NF。
例如所示关系S-C-G(Sno,Cno,Cname,Grade)就不是第二范式的关系。因为(Sno,Cno)是主键,在此关系中主属性有(Sno,Cno),非主属性有Cname,Grade。因为Cno->Cname,所有(Sno,Cno)P>Cname,这就是非主属性部分依赖于候选码。
这个关系模式S-C-G(Sno,Cno,Cname,Grade)不是一个好的关系,它存在着数据冗余,以及插入异常,删除异常,修改异常
**第三范式3NF:**若关系模式R(U,F)∈1NF,并且每一个非主属性都非传递依赖于候选码,则R(U,F)∈3NF
判断关系是否属于3NF的方法是:是否存在某个非主属性,它的传递函数依赖于候选码,或者函数依赖于某个非主属性,存在则不属于3NF,不存在则属于3NF。
例所示关系模式worker(name,branch,manager)就不是第三范式的关系。因为name是主键,在此关系中主属性有name,非主属性有branch和manager。而name–>branch,branch–>manager,所以name–>(传递)manager,这就是非主属性传递依赖于候选码。关系模式worker(name,branch,manager)是第二范式的关系。因为该关系的候选码只有一个属性,其他非主属性对候选码都是完全函数依赖
从上面例子可以看出,关系R∈2NF,但有可能不属于3NF。达到3NF的要求比达到2NF高。
**BC范式:(BCNF)**期末考试一定不满足这个范式
R∈BCNF,则R∈3NF(充分)
R∈3NF,则R不一定∈BCNF(不必要)
如果R∈3NF,且只有一个候选码,则是充分必要条件
? 事务具有四个特性:原子性(Automicity)、一致性(Consistency)、隔离性(Isoation)、持久性(Durability),简称为ACID特性。
***考:***错误的并发调度可能产生的三种错误,又称为三类数据不一致性:
封锁:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,这种调度策略为可串行化的调度。可串行化是并发事务正确调度的原则。虽然以不同的顺序执行事务可能会产生不同的结果,但是不会将数据库置于不一致的状态,因此都是正确的。
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。并发控制的任务是:保证事务的并发调度是正确的(保证隔离性/可串行化—效果上等价于某个可串行调度),最后不会破坏数据一致性。
封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象如表,记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能对此数据对象进行某些操作。
封锁的基本类型有两种:排他锁(Exclusive Locks,简称X锁)和共享锁(Share Locks,简称S锁)
X锁,又称写锁,或排他锁。一个事务对数据对象A进行修改(写)操作之前,给它加上X锁,加上X锁之后,其他任何事务都不能再对A加任何类型的锁,直到X锁被T释放为止。
S锁,又称读锁,或共享锁。一个事务对A进行读取操作之前,给它加上S锁。加上S锁后,其他事务可以对A进行加更多的锁。当然,只能是另外一个S锁,而不能是X锁,直到S锁被T释放为止。
事务对数据对象加锁时,还需遵循某些规则,包括是否(对读写操作)加锁;何时加锁,何时释放。我们称这些规则为封锁协议。对封锁方式规定不同的规则,就形成了不同级别的封锁协议。不同级别的封锁协议所能达到的系统一致性级别时不同的。
封锁协议 | X锁(对写数据) | S锁(对只读数据) | 不丢失修改(写) | 不读“脏”数据(读) | 可重复读(读) |
---|---|---|---|---|---|
一级 | 事务全程加锁 | 不用加锁 | 是 | ||
二级 | 事务全程加锁 | 读前加锁,读完后即可释放 | 是 | 是 | |
三级 | 事务全程加锁 | 事务全程加锁 | 是 | 是 | 是 |
? 两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。两段锁协议要求,在对任何数据进行读写之前,事务首先要获得对该数据的S或X封锁,释放后不能再读,写该数据。在释放第一个封锁之后,事务不再获得任何其他封锁,即事务分为如下两个阶段。
? 事务过程 --开始------加锁段-------段分界-------解锁段------->
(1)生长阶段:在这个阶段事务获得所有需要的锁,并且不释放任何封锁
(2)收缩阶段:在这个阶段的事务释放全部的锁,并且也不能再获得任何新锁
若所有事务均遵从两段锁协议,则对这些事务的并发调度一定是可串行化的。反过来,在一个可串行化调度中,不一定所有事务都遵从两段锁协议。因此,所有事务都遵从两段锁协议是可 串行化调度的充分而不是必要条件。
可以证明,若并发执行的所有事务都遵守两段锁协议,则这些事务的任何并发调度策略都是可串行化的。但若并发事务的某个调度是可串行化的,并不意味着这些事务都遵守两段锁协议。
可避免而不可杜绝死锁。
数据库系统中可能发生各种各样的故障,大致故障可以分为以下4类:
建立冗余数据最常用的技术就是数据转储和登记日志文件。
(1)日志文件的格式与内容
日志文件是用来记录事务对数据库的更新操作的文件。不同数据库系统采用的日志文件格式完全不一样。概况起来日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件
以记录为单位的日志文件,登记到日志文件的内容包括:
① 登记各个事务开始的日志记录
② 登记各个事务结束的日志记录
③ 登记各个事务中修改操作对象的日志记录(每次修改对应一条记录)
(2)日志文件的作用
日志文件再数据库恢复中起着非常重要的作用。可以用来进行事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复。日志文件的具体作用是:事务故障恢复和系统故障恢复必须用日志文件。
(3)登记日志文件
为保证数据库是可恢复的,登记日志文件必须遵循两条原则:
① 登记的次序严格按并发事务执行的时间次序;
② 必须先写日志文件,后写数据库;