数据库系统
数据库系统概念
- 数据库系统DBS的组成:数据库、硬件、软件、人员。
- 数据库管理系统DBMS的功能:数据定义、数据库操作、数据库运行管理、数据的存储管理、数据库的建立和维护等。
- DBMS的分类:关系数据库系统RDBS、面向对象的数据库系统OODBS、对象关系数据库系统ORDBS。
- 数据库系统的体系结构:集中式数据库系统(所有东西集中在DBMS电脑上)、客户端/服务器体系结构(客户端负责请求和数据表示,服务器负责数据库服务)、并行数据库系统(多个物理上在一起的CPU)、分布式数据库系统(物理上分布在不同地方的计算机)。
三级模式-两级映射
内模式
:管理如何存储物理的数据,对数据的存储方式、优化、存放等。模式
:又称为概念模式
,就是我们通常使用的表这个级别,根据应用、需求将物理数据划分成一张张表。外模式
:对应数据库中的视图这个级别,将表进行一定的处理后再提供给用户使用。例如,将用户表中的用户名和密码组成视图提供给登录模块使用,而用户表中的其他列则不对该模块开放,增加了安全性。外模式一模式
映像:是表和视图之间的映射,存在于概念级和外部级之间,若表中数据发生了修改,只需要修改此映射,而无需修改应用程序。模式一内模式
映像:是表和数据的物理存储之间的映射,存在于概念级和内部级之间,若修改了数据存储方式,只需要修改此映射,而不需要去修改应用程序。
数据库的设计
- 需求分析:即分析数据存储的要求,产出物有数据流图、数据字典、需求说明书。获得用户对系统的三个要求:信息要求、处理要求、系统要求。
- 概念结构设计:就是设计E-R图,也即实体-联系图,与物理实现无关,就是说明有哪些实体,实体有哪些属性。工作步骤包括:选择局部应用、逐一设计分E-R图、E-R图合并。
- E-R图进行合并:它们之间存在的冲突主要有以下3类:
属性
冲突。同一属性可能会存在于不同的分E-R图中,由于设计人员不同或是出发点不同,对属性的类型、取值范围、数据单位等可能会不一致。命名
冲突。相同意义的属性,在不同的分E-R图上有着不同的命名,或是名称相同的属性在不同的分E-R图中代表着不同的意义。结构
冲突。同一实体在不同的分E-R图中有不同的属性,同一对象在某一分E-R图中被抽象为实体而在另一分E-R图中又被抽象为属性。
- 逻辑结构设计:将E-R图,转换成
关系模式
,也即转换成实际的表和表中的列属性,这里要考虑很多规范化的东西。工作步骤包括:确定数据模型
、将E-R图转换成为指定的数据模型
、确定完整性约束和确定用户视图
。 - 物理设计:根据生成的表等概念,生成物理数据库。工作步骤包括
确定数据分布
、存储结构
和访问方式
。 - 数据库实施阶段:数据库设计人员根据逻辑设计和物理设计阶段的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
- 数据库运行和维护阶段:数据库应用系统经过试运行即可投入运行,但该阶段需要不断地对系统进行评价、调整与修改。
- 数据模型的三要素:数据结构、数据操作、数据的约束条件。
- 在E-R模型中,使用椭圆表示
属性
(一般没有)、长方形表示实体
、菱形表示联系
,联系的两端要填写联系类型
。 - 联系类型:一对一、一对多、多对多。
- 属性分类:
简单属性和复合属性
(属性是否可以分割)、单值属性和多值属性
(属性有多个取值)、NULL属性
(无意义)、派生属性
(可由其他属性生成)。 - R模型如何转换为关系模型,每个实体都对应一个
关系模式
。 - 联系分为三种:
- 1:1联系中,联系可以放到任意的两端实体中,作为一个属性(要保证1:1的两端关联);
- 1:N的联系中,联系可以单独作为一个关系模式,也可以在N端中加入1端实体的主键;
- M:N的联系中,联系必须作为一个单独的关系模式,其主键是M和N端的联合主键。
以上,明确了有多少关系模式,就知道有多少张表,同时,表中的属性也确定了,注意联系是作为表还是属性,若是属性又是哪张表的属性即可。
关系代数运算
- 关系模式: 在代数运算时可以理解为数据库中的表,两个概念通用。
并
:结果是两张表中所有记录数合并,相同记录只显示一次。交
:结果是两张表中相同的记录。差
:S1-S2,结果是S1表中有而S2表中没有的那些记录。
笛卡尔积
:S1S2,产生的结果包括S1和S2的所有属性列,并且S1中每条记录依次和S2中所有记录组合成一条记录,最终属性列为S1+S2属性列,记录数为S1S2记录数。投影
:实际是按条件选择某关系模式中的某列,列也可以用数字表示。选择
:实际是按条件选择某关系模式中的某条记录。自然连接
:结果显示全部的属性列,但是相同属性列只显示一次,显示两个关系模式中属性相同且值相同的记录。- 效率问题:关系代数运算的效率,归根结底是看参与运算的两张表格的
属性列数
和记录数
,属性列和记录数越少
,参与运算的次数自然越少,效率就越高
。因此,效率高的运算一般都是在两张表格参与运算之前就将条件判断完。
关系数据库的规范化
- 函数依赖:给定一个X,能唯一确定一个Y,就称X确定Y,或者说Y依赖于X,例如Y=X*X函数。函数依赖又可扩展以下两种规则:
- 部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C,称为部分函数依赖。
- 传递函数依赖:当A和B不等价时,A可确定B,B可确定C,则A可确定C,是传递函数依赖;
- 若A和B等价,则不存在传递,直接就可确定C。
- Armstrong公理系统:设U是关系模式R的属性集,F是R上成立的只涉及U中属性的函数依赖集。函数依赖的推理规则有:
自反律
:若属性集Y包含于属性集X,属性集x包含于U,则X→Y在R上成立。(此处X→Y是平凡函数依赖)增广律
:若X→Y在R上成立,且属性集Z包含于属性集U,则XZ→YZ在R上成立。传递律
:若X→Y和Y→Z在R上成立,则X→Z在R上成立。合并规则
:若X→Y,X→Z同时在R上成立,则X→YZ在R上也成立。分解规则
:若X→W在R上成立,且属性集Z包含于W,则X→Z在R上也成立。伪传递规则
:若X→Y在R上成立,且WY→Z,则xW→Z。
- 超键:能唯一标识此表的属性的组合。
- 候选键:超键中去掉冗余的属性,剩余的属性就是候选键。
- 主键:任选一个候选键,即可作为主键。
- 外键:其他表中的主键。
- 候选键的求法:根据依赖集画出有向图,从入度为0的节点开始,找出图中一个节点或者一个节点组合,能够遍历完整个图,就是候选键。
- 主属性:候选键内的属性为主属性,其他属性为非主属性。
- 实体完整性约束:即主键约束,主键值不能为空,也不能重复。
- 参照完整性约束:即外键约束,外键必须是其他表中已经存在的主键的值,或者为空。
- 用户自定义完整性约束:自定义表达式约束,如设定年龄属性的值必须在0到150之间。
- 触发器:通过写脚本来规定复杂的约束。本质属于用户自定义完整性约束。
- 数据库中的范式:
范式
是符合某一种级别的关系模式的集合,是衡量关系模式规范化程度的标准,从低到高主要有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。以下是数据库中范式的总概论以及用图表表示的第1、2、3范式:
范式 | 定义 | 示例 | 存在问题 |
---|---|---|---|
第一范式(1NF) | 列具有原子性,不可再分 | 学生表(学号,姓名,年龄,课程),其中“课程”列如果记录为“数学,语文”就不符合1NF,应拆分为多个课程列或建立课程表与学生表关联 | 数据冗余大,插入、删除、更新异常 |
第二范式(2NF) | 在1NF基础上,非主属性完全依赖于主键,消除部分依赖 | 学生选课表(学号,课程号,成绩,课程名称),假设主键是(学号,课程号),“课程名称”只依赖于“课程号”,存在部分依赖,不符合2NF,应将“课程名称”等课程相关信息移到课程表中 | 仍可能存在数据冗余和更新异常等问题 |
第三范式(3NF) | 在2NF基础上,非主属性不传递依赖于主键,消除传递依赖 | 员工表(员工编号,员工姓名,部门编号,部门名称),假设部门编号决定部门名称,“部门名称”通过“部门编号”传递依赖于“员工编号”,不符合3NF,应将部门相关信息移到部门表中 | 相对更优化,但在一些特殊场景下可能还需要进一步优化 |
-
BC范式
BCNF:所谓BCNF,是指在第三范式的基础上进一步消除主属性对于码的部分函数依赖和传递依赖。通俗的来说,就是在每一种情况下,每一个依赖的左边决定因素都必然包含候选键。 -
4NF
是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。关系模式最高的规范化程度是4NF
。 -
模式分解:范式之间的转换一般都是通过拆分属性,即模式分解,将具有部分函数依赖和传递依赖的属性分离出来,来达到一步步优化。
-
模式分解一般分为以下两种:模式分解、保持函数依赖的判断。
-
保持函数依赖分解:对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持原来的依赖集不变,则为保持函数依赖的分解。另外,注意要消除掉冗余依赖(如传递依赖)。
-
保持函数依赖的判断(补充,第2点不强求):
- 如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(这是一个充分条件)。
- 如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断。
-
无损分解
:分解后的关系模式能够还原出原关系模式,就是无损分解;不能还原就是有损。
并发控制
- 多用户数据库系统
- 多事务执行方式
- 事务串行执行
- 事务并发执行
- 交叉并发方式(单处理机系统)
- 同时并发方式(多处理机系统)
- 多事务执行方式
- 事务并发执行问题
- 丢失修改
- 不可重复读
- 读‘脏’数据
- 并发控制任务
- 正确调度并发操作
- 保证事务隔离性
- 保证数据库一致性
- 并发控制技术
- 封锁
- 排它锁(X锁)
- 共享锁(S锁)
- 活锁和死锁
- 活锁及避免方法(先来先服务)
- 死锁及解决方法
- 死锁预防(一次封锁法、顺序封锁法)
- 死锁诊断与解除(超时法、等待图法)
- 封锁协议
- 一级封锁协议
- 二级封锁协议
- 三级封锁协议
- 时间戳
- 乐观控制法
- 多版本并发控制
- 封锁
事务的四个性质
原子性
(Atomicity)- 事务操作要么全成功,要么全失败
- 例:银行转账,扣钱和加钱操作必须同时完成或都不完成
一致性
(Consistency)- 事务执行前后,数据库保持完整性和正确性
- 例:转账前后,账户总金额不变
隔离性
(Isolation)- 并发事务间相互隔离,互不干扰
- 例:多个转账事务同时进行,互不影响
持久性
(Durability)- 事务提交后,修改永久保存,系统故障不丢失
- 例:转账成功后,即使系统崩溃,记录仍在
- 事务管理:事务提交commit,事务回滚rollback。
- 事务是并发控制的前提条件,并发控制就是控制不同的事务并发执行,提高系统效率,但是并发控制中存在下面三个问题:
丢失更新
:事务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做的事是无效的,读到了脏数据。
- 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锁,直到事务结束才释放。可解决丢失更新、读脏数据、数据重复读问题。
- 两段锁协议:每个事务的执行可以分为两个阶段,生长阶段(加锁阶段)和衰退阶段(解锁阶段)。
- 加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
- 解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
- 两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。
数据故障与备份
- 静态转储:即
冷备份
,指在转储期间不允许对数据库进行任何存取、修改操作;优点是非常快速的备份方法、容易归档(直接物理复制操作);缺点是只能提供到某一时间点上的恢复,不能做其他工作,不能按表或按用户恢复。 - 动态转储:即热备份,在转储期间允许对数据库进行存取、修改操作,因此,转储和用户事务可并发执行;优点是可在表空间或数据库文件级备份,数据库扔可使用,可达到秒级恢复;缺点是不能出错,否则后果严重,若热备份不成功,所得结果几乎全部无效。
- 完全备份:备份所有数据。
- 差量备份:仅备份上一次完全备份之后变化的数据。
- 增量备份:备份上一次备份之后变化的数据。
- 日志文件:在事务处理过程中,DBMS把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件。一旦发生故障,DBMS的恢复子系统利用日志文件撤销事务对数据库的改变,回退到事务的初始状态。
- 备份毕竟是有时间节点的,不是实时的,例如:上一次备份到这次备份之间数据库出现了故障,则这期间的数据无法恢复,因此,引入日志文件,可以实时记录针对数据库的任何操作,保证数据库可以实时恢复。
分布式数据库
- 布式数据库:局部数据库位于不同的物理位置,使用一个全局DBMS将所有局部数据库联网管理,这就是分布式数据库。
- 分片模式:
- 水平分片:将表中水平的记录分别存放在不同的地方。
- 垂直分片:将表中的垂直的列值分别存放在不同的地方。
- 分布透明性:
- 分片透明性:用户或应用程序不需要知道逻辑上访问的表具体是如何分块存储的。
- 位置透明性:应用程序不关心数据存储物理位置的改变。
- 逻辑透明性:用户或应用程序无需知道局部使用的是哪种数据模型。
- 复制透明性:用户或应用程序不关心复制的数据从何而来。
数据仓库与数据挖掘
-
数据仓库:是一种特殊的数据库,也是按数据库形式存储数据的,但是目的不同:数据库经过长时间的运行,里面的数据会保存的越来越多,就会影响系统运行效率,对于某些程序而言,很久之前的数据并非必要的,因此,可以删除掉以减少数据,增加效率,考虑到删除这些数据比较可惜,因此,一般都将这些数据从数据库中提取出来保存到另外一个数据库中,称为数据仓库。
-
数据仓库四大特点:
面向主题
:按照一定的主题域进行组织的。集成的
:数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的,必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企业的一致的全局信息。相对稳定的
:数据仓库的数据主要供企业决策分析之用,所涉及的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。反映历史变化
:数据仓库中的数据通常包含历史信息,系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到目前的各个阶段的信息,通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。
-
数据仓库的结构通常包含四个层次:
数据源
:是数据仓库系统的基础,是整个系统的数据源泉。数据的存储与管理
:是整个数据仓库系统的核心。OLAP(联机分析处理)服务器
:对分析需要的数据进行有效集成,按多维模型组织,以便进行多角度、多层次的分析,并发现趋势。前端工具
:主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具以及各种基于数据仓库或数据集市的应用开发工具。
-
数据挖掘的分析方法:
关联
分析:关联分析主要用于发现不同事件之间的关联性,即一个事件发生的同时,另一个事件也经常发生。序列
分析:序列分析主要用于发现一定时间间隔内接连发生的事件,这些事件构成一个序列,发现的序列应该具有普遍意义。分类
分析:分类分析通过分析具有类别的样本特点,得到决定样本属于各种类别的规则或方法。分类分析时首先为每个记录赋予一个标记(一组具有不同特征的类别),即按标记分类记录,然后检查这些标定的记录,描述出这些记录的特征。聚类
分析:聚类分析是根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,并且对每个这样的组进行描述的过程。
-
BI系统主要包括
数据预处理
、建立数据仓库
、数据分析
和数据展现
四个主要阶段。 -
BI系统数据预处理:是整合企业原始数据的第一步,它包括数据的
抽取
(Extraction)、转换
(Transformation)和加载
(Load)三个过程(ETL过程)。 -
BI系统建立数据仓库则是处理海量数据的基础。
-
BI系统数据分析是体现系统智能的关键,一般采用联机分析处理(OLAP)和数据挖掘两大技术。联机分析处理不仅进行数据汇总/聚集,同时还提供切片、切块、下钻、上卷和旋转等数据分析功能,用户可以方便地对海量数据进行多维分析。数据挖掘的目标则是挖掘数据背后隐藏的知识,通过关联分析、聚类和分类等方法建立分析模型,预测企业未来发展趋势和将要面临的问题。
-
BI系统在海量数据和分析手段增多的情况下,数据展现则主要保障系统分析结果的可视化。
反规范化技术
- 规范化操作可以防止插入异常、更新、、删除异常和数据冗余,一般是通过模式分解,将表拆分,来达到这个目的。但是表拆分后,解决了上述异常,却不利于查询,每次查询时,可能都要关联很多表,严重降低了查询效率,因此,有时候需要使用反规范化技术来提高查询效率。
- 技术手段包括:增加派生性冗余列,增加冗余列,重新组表,分割表。主要就是增加冗余,提高查询效率,为规范化操作的逆操作。
SQL语言
- SQL语法原理:SELECT之后的为要查询显示的属性列名;FROM后面是要查询的表名;WHERE后面是查询条件;涉及到平均数、最大值、求和等运算,必须要分组,groupby后面是分组的属性列名,分组的条件使用Having关键字,后面跟条件。
- 在SQL语句中,条件判断时数字无需打引号,字符串要打单引号。
- SQL语言中的语法关键字:
创建表createtable;
指定主键primarykey();
指定外键foreignkey();
修改表altertable;
删除表droptable;
索引index,视图view;
数据库查询select…from…where;
分组查询groupby,分组时要注意select后的列名要适应分组,having为分组查询附加条件;
更名运算as;
字符串匹配like,%匹配多个字符串,_匹配任意一个字符串;
数据库插入insertinto…values();
数据库删除deletefrom..where;
数据库修改update…set…where;
排序orderby,默认为升序,降序要加关键字DESC;
授权grant…on…to,允许其将权限再赋给另一用户withgrantoption;
收回权限revoke…on…from;
withcheckoption表示要检查where后的谓词条件;
DISTINCT:过滤重复的选项,只保留一条记录;
UNION:出现在两个SQL语句之间,将两个SQL语句的查询结果取或运算,即值存在于第一句或第二句都会被选出;
INTERSECT:对两个SQL语句的查询结果做与运算,即值同时存在于两个语句才被选出;
NoSQL数据库
- NoSQL最常见的解释是Non-Relational,NotOnlySQL也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。
- 按照所使用的数据结构的类型,一般可以将NoSQL数据库分为以下4种类型:
1、列式存储数据库:行式数据库即传统的关系型数据库,数据按记录存储,每一条记录的所有属性存储在一行。列式数据库是按数据库记录的列来组织和存储数据的,数据库中每个表由一组页链的
集合组成,每条页链对应表中的一个存储列。
2、键值对存储数据库:键值存储的典型数据结构一般为数组链表,先通过Hash算法得出Hashcode,找到数组的某一个位置,然后插入链表。
3、文档型数据库:文档型数据库同键值对存储数据库类似。该类型的数据模型是版本化的文档,
半结构化的文档以特定的格式存储,比如JSON。
4、图数据库:图形结构的数据库同其他采用行列以及刚性结构的SQL数据库不同,它使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要指定数据模型。 - NoSQL存在下面共同特征:
易扩展
:去掉了关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。大数据量,高性能
:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下。这得益于它的无关系性,数据库的结构简单。灵活的数据模型
:NoSQL无须事先为要存储的数据建立宇段,随时可以存储自定义的数据格式。高可用
:NoSQL在不太影响性能的情况下,就可以方便地实现高可用的架构,有些产品通过复制模型也能实现高可用。
- NoSQL整体框架分为4层,由下至上分为:
数据持久层
、数据分布层
、数据逻辑模型层
和接口层
。- 数据持久层定义了数据的存储形式,主要包括基于内存、硬盘、内存和硬盘接口、订制可插拔4种形式。
- 数据分布层定义了数据是如何分布的,相对于关系型数据库,NoSQL可选的机制比较多,主要有3种形式:一是
CAP支持
,可用于水平扩展;二是多数据中心支持
,可以保证在横跨多数据中心时也能够平稳运行;三是动态部署支持
,可以在运行着的集群中动态地添加或删除结点。 - 数据逻辑层表述了数据的逻辑表现形式。
- 接口层为上层应用提供了方便的数据调用接口,提供的选择远多于关系型数据库。NoSQL分层架构并不代表每个产品在每一层只有一种选择。相反,这种分层设计提供了很大的灵活性和兼容性,每种数据库在不同层面可以支持多种特性。
- NoSQL数据库在以下这几种情况比较适用:
- 数据模型比较简单。
- 需要灵活性更强的IT系统。
- 对数据库性能要求较高。
- 不需要高度的数据一致性。
对于给定key,比较容易映射复杂值的环境。