软件评测师笔记(4)数据库技术基础
1. 基本概念
数据库系统DBS:是一个采用了数据库技术,有组织地、动态的存储大量相关数据,方便多用户访问的计算机系统,由下面四部分组成
- 数据库:统一管理、长期存储在计算机内的,有组织的相关数据的集合
- 硬件:构成计算机系统包括存储数据所需的外部设备
- 软件:操作系统、数据管理系统及应用程序
- 人员:系统分析和数据库设计人员、应用程序员、最终用户、数据库管理员DBA
数据库管理系统DBMS的功能
- 实现对共享数据有效的组织、管理和存取
- 包括数据定义、数据库操作、数据库运行管理、数据的存储管理、数据库的建立和维护等
数据模型的三要素是指:数据结构、数据操作(数据操纵)和数据的约束条件(完整性约束)
2. 三级模式-两级映像
内模式:管理如何存储物理的数据,对应具体物理存储文件
模式-内模式映像(物理独立性):是表和数据物理存储之间的映像,存在于概念级和内部级之间,若修改了数据存储方式,只需要修改此映射而无需修改应用程序
模式(概念模式):就是我们通常使用的基本表,根据应用、需求将物理数据划分成一张张表
外模式-模式映像(数据逻辑独立性):是表和试图之间的映射,存在于概念级和外部级之间,若表中数据发生了修改,只需要修改此映射而不需修改应用程序
外模式:对应数据库中的视图这个级别,将表进行一定的处理后再提供给用户使用
3. 数据库设计
需求分析:分析数据存储要求,产出物有数据流图、数据字典、需求说明书
概念结构设计:设计E-R图(实体-属性图),与物理实现无关,说明有哪些实体,实体有哪些属性
逻辑结构设计:将E-R图转换成关系模型,即转换成实际的表和表中的列属性,这里要考虑很多规范化的东西
物理设计:根据生成的表等概念,生成物理数据库
4. E-R模型
E-R模型及实体-联系模型,使用椭圆表示属性、长方形表示实体、菱形表示联系、联系两端要标注联系类型
属性分类
- 简单属性和复合属性:属性是否可以分割
- 单值属性和多值属性:属性有多少个取值
- NULL属性:无意义
- 派生属性:可由其他属性生成
联系类型:一对一(1:1),一对多(1:n),多对多(n:n)
5. 关系模型
关系模型也即数据库中常用的表,包括实体的属性,标识出实体的主键和外键。
E-R图转换为关系模型,每个实体都要对应一个关系模式,其中实体间联系需要如下操作
- 1:1联系,联系可以放到任意的两端实体中作为一个属性(要保证1:1两端的关联)
- 1:N联系,联系可以单独作为一个关系模式,也可以在N端中加入1端实体的主键
- M:N联系,联系必须作为一个单独的关系模式,其主键是M和N端的联合主键
6. 关系代数运算
并:两张表中所有记录数合并,相同记录只显示一次
交:结果是两张表中相同的记录
差:S1-S2,结果是S1表中有但S2中没有的记录
笛卡尔积:S1 x S2,产生的结果包括S1和S2的所有属性列,并且S1中的每条记录依次和S2中所有记录组合成一条记录,最终属性列为S1+S2属性列,记录数为S1 x S2
投影(π):实际是按条件选择某关系模式中某列,列也可以用数字表示
选择(σ):实际是按条件选择某关系模式中的某条记录
自然连接
- 结果显示全部的属性列,但是相同属性列只显示一次
- 显示两个关系模式中属性相同且值相同的记录
给定关系R(A, B, C, D)和关系S(C, D, E)
对其进行自然连接运算R⋈S后的属性列为几个?
与σR.B>S.E(R⋈S)等价的代数表达式为?
A. σ2>7(RXS) B. π1,2,3,4,7(σ'2'>'7'^3=5^4=6(RXS))
C. σ'2'>'7'(RXS) D. π1,2,3,4,7(σ2>7^3=5^4=6(RXS)
解:
首先我们应该明确R⋈S之后属性列分别为ABCDE, 因此可以解答第一个问题属性列为5个
第二步我们需要将自然连接转换为笛卡尔积
假设我们对R和S进行笛卡尔积,此时属性列为ABCDCDE
- 对应列号为1234567
那么当将RXS转换为R⋈S时我们选择的列号便为12347
- 此时我们可以得到: π1,2,3,4,7(RXS)
列处理完之后我们需要处理行,可以发现R和S相同的列为S.C=R.C, S.D=R.D, 这对应着笛卡尔积的3=5, 4=6
- 此时我们可以得到: R⋈S = π1,2,3,4,7(σ3=5^4=6(RXS))
接下来我们看题目中给到的投影条件σR.B>S.E, 其中R.B对应着笛卡尔积的2列, S.E对应着笛卡尔积的7列
- 我们便可以得到最终的结果: σR.B>S.E(R⋈S) = π1,2,3,4,7(σ2>7^3=5^4=6(RXS)
7. 函数依赖
给定一个X,能唯一确定一个Y,就称X确定Y或者说Y依赖于X
函数依赖又可以扩展以下两种规则
- 部分函数依赖:(A,B)可以确定C,(A,B)中的一部分(即A)可以确定C,称为部分函数依赖
- 传递函数依赖:当A和B不等价时,A可确定B,B可确定C,则A可确定C,是传递函数依赖。若A和B等价,则不存在传递,直接就可以确定C
8. 键与依赖
超键:能唯一标识此表的属性的组合
候选键:超键中去掉冗余的属性,剩余的属性就是候选键
主属性:候选键内的属性为主属性,其他属性为非主属性
主键:任意一个候选键即可作为主键
外键:其他表中的主键
实体完整性约束(主键约束):主键值不能为空也不能重复
参照完整性约束(外键约束):外键必须是其他表中已经存在的主键的值,或者为空
用户自定义完整性约束(自定义表达式约束):如设定年龄属性的值必须在0~150之间
9. 范式
第一范式(1NF):关系中的每一个分量必须是一个不可分隔的数据项。通俗的说,第一范式就是表中不允许有小表的存在
第二范式(2NF):在满足1NF的基础上,且不存在非主属性对候选码的部分依赖则属于2NF。
第三范式(3NF):在满足1NF的基础上,表中不存在非主属性对候选码的传递依赖
BC范式:在第三范式的基础上进一步消除主属性对与码的部分函数依赖和传递依赖。通俗来说就是在每一种情况下,每一个依赖的左边决定因素都必然包含候选键
10. 模式分解
范式之间的转换一般都是通过拆分属性,即模式分解,将具有部分函数依赖和传递依赖的属性分离出来,来达到一步步优化,一般分为以下两种:
- 保持函数依赖分解
对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持
原来的依赖集不变,则为保持函数依赖的分解。另外,注意要消除掉冗余依赖
(如传递依赖)。
实例:设原关系模式R(A,B,C),依赖集F(A->B,B->C,A->C),将其分解为两个关
系模式R1(A,B)和R2(B,C),此时R1中保持依赖A->B,R2保持依赖B->C,说明分解
后的R1和R2是保持函数依赖的分解,因为A->C这个函数依赖实际是一个冗余依
赖,可以由前两个依赖传递得到,因此不需要管。◆保持函数依赖的判断:
如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(这是一个充分条件)。看函数每个依赖的左右两边属性是否都在同一个分解的模式中。
假设关系模式RU,F),属性集U={A,B,C),函数依赖集F={A>B,B→C)。若将其分解为p={R1(U1,F1),R2(U2,F2),其中U1={A,B),U2={A,C}。那么,分解P()
A,有损连接但保持函数依赖
B。既无损连接又保持函数依赖
C.有损连接且不保持函数依赖
D,无损连接但不保持函数依赖
答案:D
解析:首先,该分解,U1保持了依赖A>B,然而B->C没有保持,因此不保持函数依赖.
- 无损分解:分解后的关系模式能够还原出原关系模式,就是无损分解,不能还原就是有损。
当分解为两个关系模式,可以通过以下定理判断是否无损分解:
定理:如果R的分解为p=R1,R2},F为R所满足的函数依赖集合,分解p具有无损连接性的充分必要条件是R1nR2->(R1-R2)或者R1nR2->(R2-R1)。
11. 事务管理
事务:由一系列操作组成,这些操作要么全做,要么不做,拥有四种特性:
- 原子性:要么全做,要么全不做
- 一致性:事务发生后数据是一致的,例如银行转账,不会存在A账户转出但B账户没收到的情况
- 隔离性:任一事务的更新操作直到其成功提交的整个过程对其他事务都是不可见的,不同事务之间是隔离的,互不干涉
- 持续性:事务操作的结果是持续性的
12. 数据控制
安全性控制(security):保护数据库不受恶意访问,即防止不合法的使用所造成的数据泄漏、更改或破坏。例如可以为用户划分不同的权限
完整性控制(integrality):是指数据库正确性和相容性,防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据正确,避免非法更新
并发控制(concurrency control):事务是并发控制的前提条件,并发控制就是控制不同的事物并发执行,提高系统效率,但并发控制中存在三个问题
- 丢失更新:事务1对数据A进行修改并写回,事务2也对A进行了修改并写回,此时事务2写回的数据会覆盖事务1写回的数据,就丢失了事务1对A的更新。即对数据A的更新会被覆盖
- 不可重复读:事务2读A,而后事务1对数据A进行了修改并写回,此时若事务2再读A,发现数据不对,即一个事务重复读A两次,发现A数据有误
- 读脏数据:事务1对数据A进行了修改后,事务2读取数据A。而后事务1回滚,数据A恢复了原来的值,那么事务2对数据A做的事是无效的,读到了脏数据
故障恢复 (recovery from failure):数据库中的 4 类故障是事务内部故障、系统故障、介质故障及计算机病毒。故障恢复主要是指恢复数据库本身,即在故障引起数据库当前状态不一致后,将数据库恢复到某个正确状态或一致状态。恢复的原理非常简单,就是要建立冗余(redundancy) 数据。换句话说,确定数据库是否可恢复的方法就是其包含的每一条信息是否都可以利用冗余地存储在别处的信息重构。
13. 封锁协议
X锁是排它锁(写锁)。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务都不能再对A加任何的锁,直到T释放A上的锁
S锁是共享锁(读锁)。若事务T对数据对象A加上S锁,则只允许T读取A,但不能修改A,其他事务只能再对A加S锁,直到T释放A上的S锁
- 一级封锁协议:事务在修改数据R之前必须先对其加上X锁,直到事务结束才释放。可解决丢失更新问题
- 二级封锁协议:一级封锁协议的基础上加上事务T在读数据R之前必须对其加上S锁,读完后即可释放S锁。可解决丢失更新、读脏数据问题
- 三级封锁协议:一级封锁协议加上事务T在读数据R之前先对其加上S锁,直到事务结束才释放。可解决丢失更新、读脏数据、数据重复读问题
14. 分布式数据库
局部数据库位于不同的物理位置,使用一个全局DBMS将所有局部数据库联网管理
分片模式:
- 水平分片:将表中水平的记录分别存放在不同的地方
- 垂直分片:将表中的垂直列分别存放在不同地方
分布透明性:
- 分片透明性:用户或应用程序不需要知道逻辑上访问的表具体是如何分块存储的
- 位置透明性:应用程序不关心数据存储物理位置
- 逻辑透明性:用户或应用程序无需知道局部使用的是那种数据模型
- 复制透明性:用户或应用程序不关心复制的数据从何而来