数据库系统
DBMS的主要功能
数据定义,组织存储,操纵, 事务运行管理,维护
- DDL:data definition language 数据定义语言
- 数据组织、存储、管理:提高存储空间利用率;方便存取
- 索引查找;hash查找;顺序查找(逻辑文件)
- DML:data manipulation language 数据操纵语言
- 增删改查
- DB事务管理和运行管理:保证数据安全性、完整性…
- DB的建立和维护
文件系统和DBS的区别和联系
区别
-
本质区别:DBS整体数据结构化。数据面向现实世界,而文件系统只面向应用程序
-
DBS数据:
共享性高,因此冗余性低,节约存储空间。
数据不会被重复存储,因此避免数据不相容,不一致
数据面向整个系统,有结构,弹性大,易扩充 -
DBS数据独立性高,程序和数据具有逻辑独立性和物理独立性,通过DBS三级模式和二级映像实现
-
数据由DBMS统一管理控制:保证第2点的数据特性
1. security数据安全性保护:防止因共享,泄密 2. integrity数据完整性检查:数据正确性、有效性、相容性 3. concurrency并发控制:多用户并发操作会破坏完整性 4. recovery数据库恢复
联系:
- 文件系统和DBMS都是计算机系统中管理数据的软件
- DBMS对数据的组织和存储是通过操作系统中的文件系统实现的。
DBS的三级模式和二级映像
schema(逻辑)模式:一个
- 模式是DB中全体数据的逻辑结构和特征的描述。仅涉及type不涉及value
- 模式的一个具体值:instance实例。
- 模式相对稳定,实例相对变动。
- 是所有用户的公共数据视图。
- DBMS提供DDL数据定义语言来定义模式。
- 与应用程序和物理存储细节无关
- 综合
external schema(subschema)外模式/子模式:多个
- 通常是schema的子集
- 通常是模式的自己是各个用户的数据视图。
- 保证数据库安全性:各用户只能看见和访问对应外模式中的数据。其余数据不可见
internal schema(storage schema)内模式/存储模式:1个
- 描述数据的:物理结构和存储方式。是数据在DB内部的组织方式
- 记录的存储方式:堆、按属性值升序/降序…
- 索引的存储方式:B+树,hash…
- 数据是否压缩、加密
- 记录结构:定长、变长…
为什么DBS具有数据与程序的独立性:DB的二级映像功能
外模式:描述数据的局部逻辑结构
模式:描述数据的全局逻辑结构
内模式:描述数据的:物理结构和存储方式。是数据在DB内部的组织方式
DB:数据存储结构
DBMS在三级模式之间,提供了两层映像:
- 外模式/模式 映像:和外模式一一对应
- 模式/内模式 映像:只有一个
这两级映像保证数据具有较高的逻辑独立性和物理独立性
保证数据和程序的逻辑独立性
用户的应用程序与数据的逻辑结构是相互独立的,当模式改变时,只需要改变每一个模式/外模式映像即可,不用改变应用程序。
保证数据和程序的物理独立性
物理独立性是指用户的应用程序与数据的存储结构互相独立的。当内模式改变之后,只需要对模式/内模式映像修改,而不用改变应用程序。
概念模型
概念模型有什么作用?
- 概念模型用于信息世界的建模,连接现实世界和信息/机器世界
- 是数据库设计人员和用户之间进行交流的语言。
概念模型使用E-R diagram
实体entity:客观存在并可以相互区别的事物。如一个学生、一个部门、部门可
属性attribute:entity具有的特性。如学生的学号、姓名
key:唯一标识实体
entity type实体型:实体名和属性名抽象刻画的同类实体的类型。如:student(no, name, gender)
entity set:同一类型的实体集合。如一个实体是学生,实体集就是全体学生
关系模型
- relation: 1 realation — 1 table 一个关系对应一张二维表
- tuple: one row in table
- table 表中一行
- component分量:元祖中的一个属性值。
- attribute: one column in table 表中一列
- key: certain atrribute group which can uniquely identify a tuple
- domain: 具有相同数据类型值的集合。如:{13,12,45,2}值有相同数据类型,且范围来自年龄范围1~120
- cardinal number基数:一个domain允许不同取值个数
- cartesain product笛卡尔积:D1×D2:domain上的集合运算,二维表
什么是relation关系:值?
relation关系:笛卡尔积的子集,关系是value值
D 1 × D 2 × . . . × D n D_1×D_2×...×D_n D1×D2×...×Dn的子集:在域 D 1 , D 2 , . . . , D n D_1, D_2, ..., D_n D1,D2,...,Dn上的关系
关系表示为: R ( D 1 , D 2 , . . . , D n ) R(D_1, D_2, ..., D_n) R(D1,D2,...,Dn),R为关系名,n为degree度
如 student(name, age, sex)
- n = 1, unary relation单元关系
- n = 2, binary relation二元关系
一般笛卡尔积没有实际意义,只有其真子集有实际意义–关系
关系与关系模式?
-
关系模式是型,关系是值,是笛卡尔乘积的子集
-
关系模式是对关系的描述:写作R(U, D, DOM, F),简写为R(U)或 R ( A 1 , A 2 , . . . A n ) R(A_1, A_2,...A_n) R(A1,A2,...An)
R:关系名
U:组成关系的属性名集合
D:U中属性来源的domain
DOM:属性—domain 的映像集合
F:属性间依赖关系集合 -
静态动态:关系是关系模式在某一时刻的状态或内容。关系模式是稳定的,静态的;关系式动态的,随时间不断变化的。
如学生关系模式,在2012和2013年的关系是不同的
什么是关系数据库?
码的概念
candidate key:relation中某一个属性组能唯一标识一个元祖,而其子集不能,则该属性组为候选码【候选码可以有多个】
- prime attribute主属性:candidate key的各属性。如候选码为(name, age)则name和age就是主属性。
- non-prime attribute非主属性:不在candidate key中的属性
all-key:全码。关系模式的所有属性都是prime attribute时,称为全码
primary key:主码。从候选码中选一个
关系操作集合
操作的对象和结果都是集合
关系数据语言:SQL结构化查询语言
关系代数语言:对关系运算表达查询要求
关系盐酸语言:对关系用谓词表达查询要求
SQL:structured query language:运算+谓词
关系代数relation algebra
传统集合运算符 | 专门关系运算符 |
---|---|
U union | σ 选择seleciton |
- except | Π \Pi Π 投影 project |
∩ intersection | 连接concatenation/join |
× cartesian product | ➗除division |
并查交笛卡尔积举例:
投影举例:对列操作,重复分量会删除
连接:从笛卡尔积中选择符合查询条件的元祖
1、非等值连接:从笛卡尔积中符合给定条件如C<E的元祖
2、等值连接:从笛卡尔积中选择指定属性名(可以不同) 分量相同的元祖,结果不必去除相同属性列
select * from xsb join bjb on xsb.bjdm = bjb.bjdm
3、自然连接:等值连接的特殊情况
从笛卡尔积中选出:相同属性中分量重复的元祖,结果去除相同属性列
等值连接和自然连接的区别和联系
- 自然连接是等值连接的特殊情况
- 等值连接不要求属性列相同,只要求分量相同
- 等值连接结果表不用删除重复属性列
外连接是什么?
外连接:是指两个表在进行操作时,不仅返回符合连接和查询条件的元组,还返回不符合条件的一些元组;
左外连接是指:返回左表中仅符合连接条件, 不符合查询条件 的元组;
右外连接是指:返回右表中仅符合连接条件不符合查询条件的元组;
全外连接:左右外连接结果集去重的并集。
division举例
R÷S:
- 找到R与S公共属性列BC,剩余属性列为A
- 结果只含A属性
- 比较公共BC中分量完全相同的元祖,找到这些元组A属性下的分量,构成一个结果值,图中都为a1
- 结果重复要去重,剩下一个a1
关系演算:谓词
关系数据库语言SQL
sql语言的特点
-
综合统一:sql集DDL数据定义语言, DML数据操纵语言, DCL数据控制语言功能与一体
-
高度非过程化:sql进行数据操作,只需要提出做什么,不用指明怎么做。即不用了解存取路径,存取路径的选择和sql语句的操作过程由系统自动完成
-
面向集合的操作方式:操作对象、查找结果都可以是元祖的集合
-
同一语法 提供两种使用方式:
自含式语言:能独立用于联机交互的使用方式
嵌入式语言:能嵌入到高级语言程序中 -
语言简便,易学易用
外键
主键表 = 被参考表
外键表 = 参考别人的表 = 设置外键的表
外键:如果关系模式R中属性或属性组X不是R的主码,但是是另一个关系模式的主码。
即外键表中的外键必须是另一个表的主键。
如id表中属性学号,为学生表的主键,则称属性学号,是id表的外键。
1、外键表添加的记录中,如果外键分量并不在主键表中,则会报错
如id表添加记录,学号分量为1004,而主键表中学号没有1004,则报错
2、要删除主键表某记录,必须保证被参考分量值没有在外键表中(外键表设置外键默认restrict)
如要在主键表student中删除记录1002…,但是外键表id_table已经含有包括1002内容的记录,因此无法直接删除
cascade级联执行
从表设置外键时为cascade:主表删除/修改行,从表相关行一起删除
默认设置是restrict,即会报错
完整性约束条件
关系模型必须满足1、2:关系的两个不变性
1、entity integrity实体完整性:关系模式中的primary key主码不能为空值;
2、referential integrity参照完整性:关系模式中外键表中的foreign key外码取值只能是空值或者另一关系模式的主码;(详情见外键部分)
3、user-defined integrity用户定义完整性:关系模式中针对某一属性的约束。比如插入一条学号为001的记录,主码为学号,则关系模型要提供检查已有学号属性值中是否有001的机制。
关系数据库设计
关系模式是对关系的描述:写作R(U, D, DOM, F),简写为R(U)或 R ( A 1 , A 2 , . . . A n ) R(A_1, A_2,...A_n) R(A1,A2,...An)
- R:关系名
- U:组成关系的属性名集合
- D:U中属性来源的domain
- DOM:属性—domain 的映像集合
- F:属性间依赖关系集合
范式Normal Form
范式:符合某一种级别的关系模式的集合
规范化:低级范式通过模式分解为若干高级范式
为什么范式会出现:规范化数据库设计
不恰当的数据库函数依赖设计,会导致:
数据冗余、更新异常、插入异常、删除异常。
这些都是由于不合理的数据依赖导致的,范式理论的出现为了 解决不合理的数据依赖,使数据库设计规范化
1-3-BCNF逐级消除了什么依赖?
范式:满足不同要求的关系
1NF:关系模式中的分量不可分,即每一列不可再分。
2NF:在1NF的基础上,非主属性完全依赖于所有候选码
- 非码属性:不在候选码中的属性。
- 候选码:能唯一确定一个元祖的一个属性组,而其子集不能。
- B完全依赖于A,A的概念和候选码差不多,即A可以唯一确认B,但是A的任意真子集都不能
3NF:在2NF基础上,任何非主属性不传递依赖于主属性
规范化的过程中:
1NF到2NF消除了非主属性对码的部分函数依赖;
2NF到3NF消除了非主属性对码的传递函数依赖;
3NF到BCNF消除了:主属性对码的部分函数依赖和传递函数依赖;
BCNF到4NF消除了非平凡且非函数依赖的多值依赖。
术语
决定因素:若X->Y,则X为决定属性组/决定因素determinant
传递函数依赖
完全函数依赖:(学号,课程号)->分数,即X的任意一个真子集,都不能->Y
部分函数依赖(学号,课程号)->系:存在X的真子集可以->Y,学号单独就可以决定系
关系模式R(U, F),K为其中一个属性
candidate key:K为R的候选码,候选码是最小的超码
superkey超码:K是U的超码
事务处理:transaction processing
什么是事务? —数据库操作序列
transaction:
- 用户定义的一个 数据库操作序列 ,所有操作要么都不做,要么全做。即事务原子化,不可分割
- 并发控制的基本单位
事务的开始和结束:用户可以显式定义
- BEGIN TRANSACTION:开始事务
- COMMIT:提交上述事务的所有操作
- ROLLBACK:书屋执行过程中发生故障,则撤销所有事务操作,回到事务开始状态
ACID properties 特性
atomicity原子性:事务中操作要么不做,要么全做
consistency:一致性:与原子性密切相关,即数据库从一个一致性状态变为另一个一致性状态。
一致性即必须保证一些约束,比如完整性约束,还有现实生活中的业务逻辑以及具体的数据库内部实现
如:A从银行账户转100元给B,则该事务必须包含A-100操作和B+100操作,并且这两个操作要么不做,要么全做,才能保持一致性状态。
isolation:并发事务隔离性,即并发事务之间不能相互干扰的程度
不同的隔离级别,事务的并发程度也不同。
最强的隔离状态是所有的事务都是串行化的(serializable)(即一个事务完成之后才能进行下一个事务),这样并发性也会降到最低,在保证了强一致性的情况下,性能也会受很大影响,所以在实际工程当中,往往会折中一下。
前三种(丢失修改、不能重复读、脏读)都是并发事务在修改同一份数据的时候导致的问题,此类问题可以通过对同一个资源加锁的方式来解决。
而最后一种情况是由于不同事务并发时,新增数据导致的问题,对于新增的记录是无法加锁的,此种情况只能通过事务的串行化来解决。而串行化与并发是矛盾的,所以要在性能和事务的一致性强度上取得一个平衡
durability/permanence持久性:事务一旦commit,接下来所有故障和操作都不能对提交结果产生影响(不会被回滚)。
分布式系统
CAP:只能满足两个
- 外部一致性(external Consistency): 指在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
- 可用性(Availability): 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
- 分区容忍性(Partition tolerance): 即当节点之间无法正常通信时,就产生了分区,而分区产生后,依然能够保证服务可用,那么我们就说系统是分区容忍的。显然如果节点越多,且备份越多,分区容忍度就越高(因为即便是其中一个或多个节点挂了,仍然有其它节点和备份可用)。
外部一致性external consistency
1、两个consistency
内部一致性,指consistency in ACID
外部一致性,指在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
2、外部一致性提出背景
在分布式数据库里,当 A、B 两个事务发生在不同的机器上时,即使是最强隔离性Serializability串行化,保证先后关系也是非常困难的,所以才用 External Consistency 专门描述这种特性得到了保证
3、外部一致性分类
- 强一致性:指系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值
- 弱一致性:弱一致性是相对于强一致性而言,它不保证总能得到最新的值;
- 最终一致性:是弱一致性的特殊形式,即保证在没有新的更新的条件下,经过一段“不一致时间窗口”,最终所有的访问都是最后更新的值。最常见的是DNS服务,更新域名指向的机器后,多级缓存要等到expiration time的时候才会更新,但是随着时间的推移,最终数据会趋于一致。
接ACID
可能破坏ACID情况:
1、并发事务中操作交叉执行
2、事物运行时被强行停止
事务并发操作破坏consistency,isolation
- 丢失修改lost update:AB同读,先后提交
- A B先后读100修改
- A+10 = 110,commit110;
- B+20 = 120,commit120.
则A的修改丢失了
- 读“脏”数据dirty read:A读+修改提交;B读;A回滚
- A读100
- A修改100为200提交
- B读200
- A rollback 为100
B读到的就是脏数据
- 不可重复读:A读;B修改提交,A无法复现原数据
A B读取100
- B修改为110 commit;A下次读就是110,无法重复读取到100
- B删除100, A下次读发现记录消失(幻影)
- B添加符合100的记录,A下次读发现记录变多了(幻影)
解决破坏CI导致的3个问题:封锁
X锁,写锁,排它锁:当数据被加上写锁,其他事务不能对该数据进行读和写
S锁,读锁, 共享锁:当数据被加上读锁,允许其他事务对该数据进行读,不允许写。
一级封锁协议:事务在修改数据之前加写锁,直到事务结束才释放。该协议可以防止丢失修改;(不能同时写)
二级封锁协议:在一级封锁协议的基础上,加上了事务在读取数据之前对其加读锁,读完后即可释放读锁。该协议避免了读脏数据;(读的时候不允许写/ROLLBACK)
三级封锁协议:在一级封锁协议的基础上,加上了事务在读取数据之前必须加上读锁,直到事务结束才释放。该协议解决了不可重复读问题。
幻读:在T1读取符合某个条件的所有记录时,T2增加了一条符合该条件的记录,这就导致T1执行过程中前后读取的记录可能不一致,即T2之后读取时会多出一条记录。
关系型数据库vs非关系型
-
关系型数据库有Oracle、Microsoft SQL Server、Microsoft Access、MySQL等。
-
非关系型数据库有 、MongoDb、redis、HBase等
关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
(1).容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。
(2)使用方便,通用的sql语句使得操作关系型数据库非常方便。
(3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
问题
(1 )海量数据的读写效率低。
对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。
(2) 不易扩展
在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。
二、从关系型到非关系型
关系型数据库的最大优点就是事务的一致性,这个特性,使得关系型数据库中可以适用于一切要求一致性比较高的系统中。比如:银行系统。
但是在网页应用中,对这种一致性的要求不是那么的严格,允许有一定的时间间隔,所以关系型数据库这个特点不是那么的重要了。相反,关系型数据库为了维护一致性所付出的巨大代价就是读写性能比较差。而像微博、facebook这类应用,对于并发读写能力要求极高,关系型数据库已经无法应付。所以必须用一种新的数据结构存储来替代关系型数据库。所以非关系型数据库应用而生。
三、非关系型 not only sql
1.概念
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。
NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。
)
-
易扩展,数据之间没有关系的。
-
大数据量,高性能。高性能读写非常灵活的。
-
灵活的数据模型。不需要事先对存储数据建立字段。
2.分类
非关系数据库大部分是开源的,实现比较简单,大都是针对一些特性的应用需求出现的。根据结构化方法和应用场景的不同,分为以下几类。
(1)面向高性能并发读写的key-value数据库
主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。
(2)面向海量数据访问的面向文档数据库
特点是,可以在海量的数据库快速的查询数据。例如MongoDB以及CouchDB.
(3)面向可拓展的分布式数据库
解决的主要问题是传统数据库的扩展性上的缺陷。
3.缺点
但是由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。因此适合存储较为简单的数据。有一些不能够持久化数据,所以需要和关系型数据库结合。
数据库恢复
数据库恢复的关键和技术?
恢复关键:建立冗余
1、数据转储:DBA定期复制数据库到其他介质保存,即定期备份DB数据(后备副本)
2、登记日志文件:日志文件记录事务对数据库的更新操作
当系统运行过程中发生故障,利用后备副本和日志文件就可以将数据库恢复到故障前的某个一致性状态。
索引
索引的作用?和它的优点缺点是什么?
- 数据量大时加快查询速度
- 索引需要占一定的存储空间,且基本表更新时需要维护索引表。
索引和键有什么区别?
- 索引是存储在数据库中的一个物理结构,是实际存在的,相当于一本书的目录;
- 键是一个逻辑概念,不是数据库中的物理部分。键分为主键和外键,主键相当于一本书中每个页的页码。
数据库中常用的索引有哪些?
一、按存储方式区分:
- 叶子结点指向数据行
- 哈希函数映射到数据地址
(1)BTREE索引,也叫B+树
- 叶子节点:只有叶子结点直接指向表里的数据行。叶子节点之间通过链表彼此相连,一个叶子节点有一个指向下一个叶子节点的指针。
- 分支节点:包含的条目指向索引里其他的分支节点或者叶子节点。
- 根节点:一个 B+树索引只有一个根节点,实际上就是位于树的最顶端的分支节点。
(2)Hash索引:
通过一定的哈希函数H(key) = key % p计算出哈希值,然后映射出对应的数据存储位置。检索速度快,但是哈希值可能存在碰撞。(详情见数据结构哈希查找线性探测法)
MySQL 目前仅有 MEMORY 存储引擎和 HEAP 存储引擎支持这类索引。其中,MEMORY 存储引擎可以支持 B-树索引和 HASH 索引,且将 HASH 当成默认索引。
优点:
检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
缺点:
1、线性探测法可能会遇到大量碰撞:即遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
2、Hash 索引仅仅能满足"=","IN"和"<=>"
查询,不能使用范围查询
二、按逻辑结构区分
(1)普通索引 INDEX
create index idx_index_test_sxh on index_test(sxh)
1、没有任何限制,允许索引列插入重复值、空值
2、唯一目的:加快访问速度
(2)唯一索引 UNIQUE INDEX
CREATE UNIQUE INDEX index_id ON tb_student(id);
1、唯一目的:避免数据重复
2、索引列值必须唯一,允许NULL
(3) 主键索引:特殊的唯一索引
1、索引列必须是主键,即不允许重复,NULL
创建主键索引通常使用 PRIMARY KEY
关键字。不能使用 CREATE INDEX
语句创建主键索引。
(4) 全文索引:FULLTEXT INDEX
1、目的:查找文本中关键字
2、允许索引列值重复、NULL
3、只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建
4、在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
CREATE FULLTEXT INDEX index_info ON tb_student(info);
三. 实际使用区分
(1)单列索引:索引只包含一列
CREATE INDEX index_addr ON tb_student(address(4));
查询时可以只查询 address 字段的前 4 个字符,而不需要全部查询。
(2)组合/复合/多列索引:
只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。
CREATE INDEX index_na ON tb_student(name,address);
查询条件中必须有 name 字段才能使用索引。