过几天要考数据库了,于是把书里的概念整理一下,本文将关于不涉及SQL的操作(这部分操作知识记得比较牢,所以没复习)。
目录
1 绪论
1.1 数据库的4个基本概念
1.2 数据库系统的优点
1.3 数据库
1.4 数据模型
1.4.1 第一类:概念模型
1.4.2 第二类:逻辑模型与物理模型
1.5 数据模型的组成要素
1.6 常用数据模型
1.7 数据库三层模型结构
1.7.1 两级映象
2 关系数据库
2.1 关系
2.2 关系操作
2.3 符号含义
3 SQL
3.1 SQL的特点
4 关系数据库的查询处理
4.1 查询分析
4.2 查询检查
4.3 查询优化
4.4 查询执行
5 数据库完整性
5.1 关系完整性
5.2 DBMS如何维护数据库完整性
6 关系数据库概念
6.1 函数依赖
6.2 范式
7 数据库恢复
7.1 事务
7.1.1 ACID
7.2 故障种类
7.3 数据转储
7.4 登记日志文件
7.5 检查点
8 数据库安全
8.1 自主存储控制
8.2 强制存取控制
8.3 数据加密
8.4 数据安全性与完整性的区别
9 数据库设计
9.1 基本步骤
9.2 需求分析
9.2.1 数据字典
9.3 概念结构设计
9.3.1 E-R图
9.4 逻辑结构设计
10 数据库编程
10.1 游标
10.2 存储过程
11 并发控制
11.1 数据不一致
11.2 三级封锁协议
11.2.1 活锁
11.2.2 死锁
11.3 可串行化调度
11.4 封锁粒度
数据:描述事务的符号记录称为数据。数据的含义称为数据的语义,数据与其语义是不可分割的
数据库:数据库是长期存储在计算机内,有组织的,可共享的大量数据的集合。数据库中的数据按一定的数据模型组织,描述跟储存,具有较小的冗余度,较高的数据独立性和易扩展性,并可为各种用户共享
数据库管理系统(DBMS):数据库管理系统和操作系统一样是计算机的基础软件。主要功能包括:数据定义; 数据组织,存储跟管理;数据操作;数据库的事务管理跟运行管理;数据库的建立和维护功能。其他工功能。
数据库系统(DBS):数据管理系统是由数据库,数据库管理系统(及其应用开发工具),应用程序跟数据库管理员组成的存储,管理,处理和维护数据的系统。
数据结构化:数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。所谓的“整体结构化是指数据库的数据不止针对某一个应用,而是面向整个组织或企业。不仅数据内部是结构化的,整体也是结构化的,数据之间是具有联系性的。”
数据的共享性高,冗余度低且易扩充:数据共享可以大大减少数据冗余,节约存储空间,数据共享还能避免数据之间的不相容性与一致性。
数据独立性高:物理独立性是指用户的应用程序与数据库中的数据的物理存储是互相独立的。逻辑独立性是指用户的应用程序与数据库的逻辑结构是互相独立的。
数据由数据库管理系统统一管理和控制:数据库系统必须提供以下几个方面的保障:
(1) 数据安全性保护:保护数据以防止不合法使用造成的数据泄密和破坏。
(2) 数据完整性检查。数据完整性是指数据的正确性,有效性跟相容性。
(3) 并发控制:多个用户并发操作时,可能会互相干扰而得到错误的结果,使数据库的完整性遭到破坏
(4) 数据库恢复:。。。
数据库是长期存储在计算机内有组织,大量,共享的数据集合。它可以供各种用户共享,具有最小冗余度跟较高数据独立性。数据库管理系统在数据库建立,运用和维护时对数据进行统一控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库的出现,使得信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段。
数据模型是对现实世界的抽象。是用来描述数据,组织数据和对数据进行操作的。数据模型是数据库系统的核心和基础
数据模型主要由以下两类:
概念模型也称为信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
信息世界的基本概念
(1) 实体:客观存在并可互相区别的事物称为实体
(2) 属性:实体所具有的某一特性称为属性。
(3) 码:唯一标识实体的属性集称为码。
(4) 实体型:用实体名以及其属性名集合来抽象和刻画同类实体,称为实体型。
(5) 实体集:同一类型的实体的集合称为实体集。
(6) 联系:实体之间的联系通常是指不同实体集之间的联系。
概念模型的一种表示形式:实体-联系方法
实体-联系方法(Entity-Relationship approach)。使用E-R图来描述现实世界的概念模型
(1)逻辑模型:
主要包括层次模型,网状模型,关系模型,面向对象数据模型和对象关系数据模型,半结构化数据模型等。主要用户数据库管理系统的实现,
(2)物理模型
物理模型是对数据最低层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘上或磁带上的存储方式和存取方法,是面向计算机系统的。数据库设计人员要了解,用户不需要考虑。即是说,描述如何存在磁盘上。
(1) 数据结构:数据结构描述数据库组成对象以及对象之间的联系。
(2) 数据操作:数据操作是指对数据库中各种对象(型)的实例(值)允许的操作的集合,包括操作有关的操作规则。数据库主要由查询跟更新(增删改)两大类操作。
(3) 数据完整性约束条件:数据的完整性约束条件是一组完整性规则。是给定数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型得到数据库状态以及状态的变化。以保证数据的正确,有效,相容性。
基本层次联系是指两个记录以及它们之间的一对多(包括一对一)的联系。
层次模型:层次模型用树形结构来表示各类实体以及实体间的联系。
网状模型:使用图数据结构。
关系模型:。。。。。
三层模型结构是指数据库系统是由外模式,模式和内模式三级构成。
(1) 模式:模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据模型视图。
(2) 外模式:外模式也称子模式或者用户模式,它是数据库用户(包括普通用户跟最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
(3) 内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
外模式/模式映象:当模式改变时(例如增加新的关系,属性,或者修改属性的数据类型,即修改表结构或列属性时),由数据库管理员对各个外模式/模式的映象作相应改变,使外模式保持不变。从而使应用程序不比修改。保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
模式/内模式映象:当数据存储结构改变时(例如更换了另一种存储模式),由数据库管理员模式/内模式映象做改变,可以使模式保持不变,从而使应用程序不比改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
数据与程序之间的独立性使得数据的定义和描述可以从应用程序中分离出去。另外,由于数据的存取由DBMS管理,从而简化了应用程序的编制,大大减少了应用程序的维护跟修改。即是说,数据存取由mysql等操作,java跟python等其他语言写的程序不必关心,只需调用。
(1) 域:域是一组相同数据类型的值的集合。如{男,女},{1,0},0~100的整数集合。其实就是某个属性的取值范围
(2) 笛卡尔积:
(3) 关系:
若某一属性组(一个或多个列)能唯一地标识一个元组,而其子集不能,则称改属性组为候选码。有多个候选码,选出一个作为主码。主码可包含多个属性,最极端情况,所有属性是这个关系模式的候选码,称为全码。
关系可以有三种基本类型:基本关系(通常又称基本表或基表),查询表和视图表。
关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件。这些规范条件中最基本的一条就是,关系的每一个分离必须是一个不可分的原子数据项(即第一范式,域不重复)。规范化的关系简称为范式(NF)。
选择,投影,并,差,笛卡尔积是5中基本操作。
关系操作中,根据代数方式表示称为关系代数,用逻辑方式表示称为关系演算。
SQL语言是一种介于关系代数与关系演算之间的结构化查询语言。
关系五元组:R(U,D,DOM,F)中,
R:关系名
U:组成该关系的属性名集合
D:属性U中属性所来自的域
DOM:属性向域的映象集合
F:属性间的数据依赖关系集合
SQL支持关系数据库三级模式结构。外模式包括全部视图,和部分基本表(不创建视图的话,默认就是把整个表当视图给用户),模式包括全部基本表,内模式包括全部存储文件。
(1) 综合统一:集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能为一体
(2) 高度非过程化:SQL只要提出“做什么”,而无须指明“怎么做”,也无需了解存取路径
(3) 面向集合的操作方式:操作对象,结果都是集合
(4) 以同一种语法结构提供多种使用方式:即是独立的语言,又是嵌入式语言。即既可以在终端使用,又可以嵌入到高级语言(java,python)程序中。
(5) 语言简洁,易学易用。
如上图,包括四个阶段:查询分析,查询检查,查询优化,查询执行。
对查询语句进行扫描,词法分析和语法分析,识别出语言符号,进行语法检查和语法分析。
根据数据字典对合法的查询语句进行语义检查,根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查
选择一个高效执行的查询处理策略
分为代数优化跟物理优化。
代数优化:指表示式优化,对表示式进行等价变换,变成更高效的表示式。
物理优化:存取路径和底层操作算法的选择。如使用索引。
根据优化器得到的执行策略生成查询计划并执行
数据完整性是指数据的正确性和相容性。
正确性是指数据是符合现实世界语义,反应实际情况的。相容性是指同一对象在不同表中的数据是符合逻辑的。完整性是为了防止数据库中存在不正确的数据。
三大完整性约束:实体完整性,参照完整性和用户定义完整性。其中实体完整性跟参照完整性是必须满足的,称为关系的两个不变性。
实体完整性:即主键(主码)约束。包括主键必须唯一,且不能为空
参照完整性:即外键约束。参照其他表的主键值,若修改后发生两者不一致。可采用
(1) 拒绝执行(默认)。即不允许被参照的表修改或删除此属性。
(2) 级联。即被参照的表修改或删除时,自己也跟着修改或删除。
(3) 设置为空。即被参照的表修改或删除时,自己设置为空。
用户定义完整性:如:列值唯一,取值范围必须在1-100之间,属性值不能为空等。
简单不严谨描述:
如果x是y的决定性因素。则称y依赖于x。可以理解为知道y的值就可以确定x的值
如果y的决定性因素只有x一个,则称y对x完全函数依赖。
如果y的决定性因素有多个,如x可以决定y,z也可以决定y。那么就叫y对x部分函数依赖。
如果x决定y,y决定z。则称z对x传递函数依赖。
由于码唯一标识元组,是决定性因素,因此元组依赖于码,码至少是对元组是部分依赖,因此也叫候选码。候选码中需要选一个作为主码。
所有候选码中的属性都叫主属性,其他属性叫非主属性。
一个低一级的范式关系模式,通过模式分解可以转化为若干个高一级范式的关系模式的集合,这个过程就叫做规范化。简单说,范式就是如何教你分表的,模式分解的结果就反映分表的结果,随意写的excel表格问题太大。极端的,如果所有的属性都放在一张表中,那这张表的冗余数据(即重复数据)就会很多,并且会产生各种问题。
1NF:即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项,即无重复的列。
2NF:R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码。即无部分依赖,全是完全依赖。2NF是对记录的惟一性约束,也即实体的惟一性,更通俗说一定要有主键ID,所有属性都依赖于主键,不存在需要主键为空的情况。
3NF:非主属性不依赖其他非主属性。无传递依赖。3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来。简单来说就是太多冗余时要分表,如果存在依赖S→C→D,那么就分成S→C跟S→D两张表(两个实体或关系),这样可以减低冗余度。
BCNF:所有的依赖都是对码的依赖。即是说,分表分到所有可以当主键的字段都在不同表,这样的实体多,减少冗余度。
4NF:不允许有非平凡且非函数依赖的多值依赖。要求把表中的多对多关系删除。
如果一个关系R,不满足对应的范式,就会产生以下问题:
(1) 插入异常。以不满足2NF举例,此时一个表中有两个实体,此时主键是(Sno,Cno)。一个课程,一个学生,如果你想只插入课程或者只插入学生,就会出问题,因为只提供Sno或者Cno并不能满足主键约束。
(2) 删除异常。
(3) 修改复杂。每次都得修改一堆重复数据。
需要知道,没有冗余的数据库并不是最好的数据库,因为,范式越高,分的表就越多,这样的数据库,效率太低,需要链接太多的表结构,而join操作耗时。
所以一般的,一个数据库设计符合3NF或BCNF就可以了。
关于实例,这里不给出,推荐下面两篇文章,可以结合理解。
https://josh-persistence.iteye.com/blog/2200644
https://mp.weixin.qq.com/s/wyt-0y3lEhewa2cpeILYSQ
恢复的关键是建立冗余数据,建立冗余数据常用的技术是数据转储和登记日志文件。
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的单位。
即原子性,一致性,隔离性,持续性。
原子性:是说要么都做要么都不做,不能只做一部分。
一致性:事务执行的结果必须是数据库从一个一致性到另一个一致性。简单说就是,我同一个事务里的数据不能被别人改了,不然我读一次变量A=100正确,然后被别人改200,我明明没改A,却发现A变200了。
隔离性:事务的执行不会互相干扰。
持续性:事务提交后,它对数据改变是永久性的。即是说别人只能在这事务只上修改,不能跳到它前面的数据,然后就直接修改,类比现实就是,你不能穿越时空到以前把你做的事改了,你只能在现在的基础上,对现状进行改变。
大致可以分为几大类:事务内部故障,系统故障,介质故障,计算机病毒
事务内部故障:当事务内部出现问题时,进行回滚
系统故障:比如系统出现bug,断电,cpu出问题。
介质故障:指外存设备故障,如磁盘坏了
计算机病毒:。。。
数据转储其实就是备份。将数据复制到磁带或者磁盘上,备份的数据称为后备数据。
根据是否可以在写操作时存储。分为以下两种:
静态转储:是指系统中无运行事务进行的转储操作。保证数据一致性,但会降低数据库可用性。
动态转储:转储期间允许数据库进行存取或修改。可用性高,但不能保证一致性。
根据每次存储方式,也可分为以下两种:
海量转储:每次转储全部数据库。恢复方便,适用数据库小
增量转储:每次只转储更新过的数据。适用数据库大,但恢复没那么方便。
静态转储就是为了跟你保持一致,我要你做完事我才保存。这样我总是跟你最后的数据一致。缺点是速度慢,因为串行执行。就是等学霸写完作业,你再抄他的,因此你能保证他的是最终答案,但是耗时
动态转储就是看到你修改了,我就同时偷偷修改。显然速度快点,就是学霸写作业时你就抄,然后学霸改了,你就得跟着改。快是快了,但是,学霸改的时候,你的答案是错的。
海量存储:即管你改不改,老子保留你现在的全部数据,下次恢复,直接根据这个版本恢复,即每次修改量大,但恢复时只要当前版本,很方便。
增量存储:你改我跟你一起改,你没改我不管。恢复时,你需要从当前版本一直找到最前面的版本才能恢复,所以每次修改量小,但恢复时麻烦些。
日志文件是用来记录事务对数据库的更新操作的文件。
日志文件要登记的内容有:事务的开始与结束,事务的所有更新操作。一个事务对应一个日志记录。
日志文件的记录内容主要包括:
1.事务标识(标明哪个事务)
2.操作类型(增删改)
3.操作对象
4.数据的旧值跟新值(插入旧值为空,删除新值为空)。
必须先写日志文件,后写入数据库(但是在提交事务时,要先写入提交事务标志,再写入日志)。原因是:如果遇到故障(如断电),数据库可恢复根据日志文件恢复,然后发现,数据库
日志太多了,每次查找数据太多,于是加入检查点。表示从某个事务开始
计算机系统的安全性问题主要分为三大类:技术安全类,管理安全类,政策法律类
用户权限由两个要素组成:数据库对象和操作类型。定义存取权限称为授权。
关系型数据库中,存取控制的对象不止有数据本身(增删改查数据,列属性),还有数据库模式(包括模式,基本表,视图跟索引的创建)
强制存取控制为了保证系统有更高程度的安全性。主要是通过主体的许可证级别与客体的密级实现的
密级的次序是TS>=S>=S>=C>=P..
遵守规则:
主体许可证级别 >= 客体密级, 主体可以读。
主体许可证级别 <= 客体密级, 主体可以写。
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记跟数据是一个不可分割的整体,只有符合密级标记的才可以操纵数据。
如高考出题老师,每个人只能写跟读自己的部分(密级相等)。只有高层才能读,但高层不能改题目,出问题也只能让别人改。监考老师不能擅自打开试卷袋,需要学生签名,表示没开封过(开封前不能读,许可证低)。防止监考老师以及提前打开的,但拿去复印过。
加密的基本思想是根据一定算法将原始数据——明文变换为不可直接识别的格式——密文,从而使不知道解密算法的人无法获知数据的内容。
数据加密包括存储加密跟传输加密
存储加密:透明跟非透明两种,透明是对用户透明,写到硬盘时加密,用户读取时解密。非透明则是使用多个加密函数进行加密
数据的完整性:防止数据库中存在不符合语义的数据,即防止数据库中存在不争取的的数据,其防范对象是不合语义,不正确的数据。
数据的安全性:保护数据库,防止恶意的破坏或非法的存取,其防范对象是非法用户和非法操作。
数据库设计是指对于一个给定的应用环境,设计优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的需求,包括信息管理要求和数据操作要求。
基本步骤包括:
(1) 需求分析
(2) 概念结构设计
(3) 逻辑结构设计
(4) 物理结构设计
(5) 数据库实施
(6) 数据库运行与维护
调查的重点是“数据”和“处理”,通过调查,收集与分析,获得用户对数据库的信息要求,处理要求安全性与完整性要求。
数据字典是进行详细数据收集和数据分析所获得的主要成果。它是关于数据库中数据的描述,即元数据,而不是数据本身。数据字典是需求分析阶段建立,在数据库设计过程中不断修改,充实,完善的。它在数据库设计中占有很重要的地位。
数据字典通常包括:数据项,数据结构,数据流,数据存储,处理过程。
数据项:简单来说就是所有表结构的集合。
数据结构:数据结构反映数据项之间的关系。
数据流:数据的来去向,流量等
(1) 实体用矩形表示
(2) 属性用椭圆形表示
(3) 联系用菱形表示
各子系统的E-R图的主要冲突主要由三类:属性冲突,命名冲突和结构冲突。
把E-R图转换为选用数据库管理系统产品所支持的数据模型相符的逻辑结构。即根据表结构列出
码需要用下划线标出,如:
学生(学号,名字,性别,专业,年龄)
游标的作用是解决集合性操作语言与过程性操作语言的不匹配问题。
sql语句中使用的主语言变量,称为主变量。即你使用的java,pyhon等语言。
游标是系统为用户开设的一个数据缓冲区,存放sql的执行结果。用户可以通过游标获取记录并赋值给主变量。
存储过程是由过程化sql语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只需要调用就行。
优点:
(1) 存储过程行效率高。因为是编译后的,不需要进行语义分析
(2) 存储过程降低了客户端与服务器之间的通信量。只需要提供过程名跟参数,等服务器执行完就返回结果。
(3) 方便实施企业规则。
事务是并发控制的基本单位。
(1)丢失修改。
(2)不可重复读。
(3)读“脏”数据。
三个操作(注意没有幻读)主要原因是破坏了事务的隔离性。并发控制机制就是要正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰。
并发控制的主要技术有:封锁,时间戳,客观控制法和多版本并发控制。
写锁是排他锁,简称X锁,读锁是共享锁,简称S锁。排他锁即加上后不再允许读写,共享锁即加上后允许读。
(1) 写数据时要加上X锁,加上X锁时,其他线程要再加X锁或S锁,得等待写数据结束释放锁,才去争夺。解决了丢失修改问题
(2) 读数据需要加上S锁,加上S锁后,其他线程可以再加S锁,但不能再加X锁。解决了不可重复读问题。
(3) 加上X锁时,要锁到事务结束才释放。解决了读脏数据问题。
封锁问题可能产生活锁跟死锁。
活锁即是,多个线程争抢时,如果没有设置先后顺序,竞争力低的线程可能会永远等待。
最简单的解决方法是是采用先到先服务。即排队,而不让他们自由竞争。
死锁是多个事务互相封锁了对方所用的资源和数据,导致几个事务都无法执行下去。
用户A拿到资源1的锁后还需要拿资源2的锁,用户B拿到资源2的锁后还需要拿资源1的锁。这样形成了T1等待T2,T2又在等待T1的局面,T1和T2两个事务永远不会结束,形成死锁。
解决方法有预防或诊断与解除的方法:
1.预防死锁(操作系统常用):
(1) 一次封锁法:需要申请的资源一口气列出清单,一口气全部加锁。问题:1一次就要把全部数据加锁,扩大了范围,降低了系统的并发度。2是数据库数据是不断变化的,很难精确每个事务要封锁的数据对象,因此只能扩大范围,进一步降低并发度。一次性封锁法适用于,数据不经常变动的。
(2) 顺序封锁法:规定一个封锁顺序,比如一定要先拿到T1的锁才能再拿T2的锁。但数据库中由于数据经常插入,删除。维护这样的数据封锁困难,成本高。同时,事务一直在变,封锁对象的顺序难以确定。
2.诊断与解除:
(1)超时法:设置规定一定时间超时。这样就不会无限等待。
(2)等待图法(数据库常使用):
T1→T2代表T1需要等待T2。画出等待图,成环的就是死锁。死锁的情况多种多样。人们有很多种做法。
通常采用的方法是,处理死锁最小代价的事务,比如(b)图中干掉T2或者T3,就不会成环。
多个事务的并发执行是正确的,当且仅当结果与按某一次序串行地执行这些事务时的结果相同,这种调度策略称为可串行化调度。
如:
现在有数据a = 100
T1事务是+20,T2事务是-30,T3事务是*2
a经过T1, T2, T3的结果是((100+20)-30)*2=180
a经过T3,T1,T2的结果是100*2+20-30=190
a经过T2,T3,T1的结果是(100-30)*2+20=160
a经过.....
只要执行加过是以上的180,190,160等结果的其中一个,就认为是是并发正确的。
封锁对象的大小称为封锁粒度。封锁对象可以是属性值,属性值集合,元组,关系,索引项,整个索引乃至整个数据库这些逻辑单元,也可以是页,物理记录等一些物理单元,
封锁粒度与系统的并发度和并发控制的开销密切相关。
支持多种粒度封锁供不同事务选择,叫多粒度封锁。
显示封锁:直接加在对象上的锁。
隐式封锁:自己没有加锁,而是被上级节点锁住了
直接检查封锁冲突,效率低,因此出现了意向锁
意向锁:如果一个对象被加了意向锁,则代表该节点下层节点全部被加锁。