数据库系统原理概念整理(备考)

基本概念

数据模型 描述数据的概念和工具
关系数据模型 用关系描述数据
数据模型 包含三个方面 结构 操作 约束
对应于 关系数据模型 关系(表) 关系代数 主外键约束,断言
逻辑数据模型:详尽的描述数据,不关心具体的物理层实现,如关系数据模型中,设计实体及实体间的关系,属性,约束等等。业务逻辑的体现。
逻辑模型 --------查询处理----------物理模型
逻辑方面:SQL结构化查询语言,描述关系代数的。
物理方面:真正找的时候得面向操作系统和硬件。操作系统有文件系统文件系统是一条一条的记录存在一个文件里。 对文件有创建删除、对记录增删改的操作。
数据真正存储是在磁盘上,磁盘这边发生实际的存取操作存取操作
磁盘最小存取单位其实是扇区。但文件系统对磁盘存取的最小逻辑单位是块。

model/schema/pattern

model 模型,是一种描述问题的工具 比如对象模型,关系模型。这类模型是一些规定,这些规定描述了如何去描述一个概念,同时还规定了一系列的操作,这些操作描述了概念之间如何进行交互。他是用来帮助人们记录和分析问题的。

schema模式 可以认为使用模型model建模得到的东西就是模式。虽然MySQL管他的数据库叫做模式,但是一个运行中的数据库并不是一个模式,而是一个模式的一个具体实例。因为同一个模式可以有很多个实现,比如Northwind数据库在很多人的机器上都有,但是都是用的Northwind数据库模式。

模式pattern 而Pattern更多的用于描述概念实例之间的关系,重点是实例的特征。比如某些数据具有一些特定的模式(Pattern),比如电话号码总是【区号-号码】自我感觉是一些方式,套路,方法。数据挖掘挖的就是数据的pattern。

数据库特点

封闭假设:全部事实存在数据表格里
中心化:DBA管理
一致性:数据库从一个一致性的状态到另一个一致性的状态。

数据库发展

逻辑-面向对象-半结构化XML\PDF-NoSQL(键值对)

数据库领域成就

  • 关系数据模型 和语义语法
  • 索引 化解大海捞针的问题 查询导向相关数据
    索引是一个根据值查地址的表,一个map地图。就和文件分配表一样,拿着文件名找文件存在磁盘的位置。
    B+树
    1.logdN
    2.磁盘预读

hash 等值 点查询
索引的使用条件 小表直接全表扫描
大表 索引
特大表 分区技术 找到一组数据索引后扫描就行了

  • 查询优化 代价较小的执行计划
    代数优化 对查询语句进行变换,如先做投影选择,再做l连接等二元操作。
    物理优化 根据系统提供的存取路径,选择合适的存取策略,如选择顺序扫描还是索引。
    规则优化 对查询做一些启发式规则以执行查询的策略。
    代价估算优化,用代价模型估算出可供选择的执行策略的代价,选择代价最小的策略。
    查询的时间开销 三部分 磁盘IO 计算CPU代价 通信代价

优化数据访问 减少请求的数据量,只返回必要的数据,缓存。
减少服务器的扫描,如使用索引

  • 并发调度 吞吐量
  • 分布式的可扩展性 垂直扩展性和水平扩展性

知识图谱相关

为什么需要知识图谱
数据量越来越大,人们处理困难,机器无法直接获取互联网上文本的语义信息。为了让机器理解背后的语义,对可描述的实体建模,添加属性,拓展事务间的联系。由一个个的主谓宾三元组组成。不再是字符串,而是一个一个现实中的实体概念。
结构化数据 严格结构和约束,用关系数据库的表存储
半结构化数据 用标签这样较为灵活的方式分隔不同概念,以及对记录和字段进行分层。
非结构化数据 数据没有结构,图,视频,音频,文档等。
知识主要描述的是概念和概念间的关系
知识图谱是动态开放的 对应数据库是封闭假设
虽然讲的都是关系 数据库讲的是多元关系 知识图谱讲的是二元关系 主谓宾

区块链相关

数据库从 逻辑数据库 到 面向对象数据库 到XML 图数据库 到NoSQL数据库
三个主要成就 关系数据模型 优化和索引 事务模型
一致性是系统基本要求 一,约束 二,多副本一致性
互联网需要可扩展性。早期是垂直扩展,现在是水平扩展,一致性很重要。
通常是通过Paxos协议保证故障情况下数据一致性。这种一致性不太够,副本不多,管理控制权限在单个实体中。

去中心化!一致性重新定义,需要在参与主体间保持数据一致性,形成共识,需要解决故障攻击外的恶意攻击。形式上,需要在更多副本间达成一致性,从而在参与实体间实现存在性证明,应用于数字货币,交易等具有价值属性的人类活动。
目前多共识性的基本实现方法是每个节点的完全冗余,还有一种实现方法是Paxos实现备份一致性,然后通过拜占庭协议实现共识性,从而实现数据共识性。
数据库遇到区块链要解决的根本性问题是:将中心化的数据一致性拓展到区中心环境下的数据共识性。

数据库要想到区块链 解决从一致性拓展到共识性的技术方法。
数据库技术促进当前的区块链技术发展。 因为数据库对共识性的理解是对一致性的扩展:
1.副本数目大大飙升,恶意攻击。(客观需要)
2.需要扩充区块链中仅仅关于存在性共识的语义,需要实现在关系模型语义下的一致性、共识性。(主管需要)这种思路有希望解决完全通过冗余副本来实现存在性共识的低效机制。
另一个可能的重大贡献, 通过描述性语言表达区块链的逻辑。从而提供一个描述性的区块链。

区块链 共识 无需信任 去中心
数据库 一致性 可扩展 中心化
区块链用 数据加密学 工作量证明 节点的共识机制保证数据安全。

区块链数据库特征:
描述性接口
分布式数据库
可编程去信任机制
共识性语义/异构一致性
可拓展性
并发事务调度和高吞吐

join

自然连接
1.nested join 一层中的每一个对第二层的所有判断 n^2 没法接受
因为数据库对磁盘的IO更影响效率,文件系统对磁盘的IO是按块的 把小的表放外面可以减少存取
2. indexed nested join 用索引可以减少扫描的量
3. merge join 类似合并排序 前提是有序了
4. hash join 必须是等值join
5. aggregation 聚集 将某一列的值或多列的组合值(一个属性和属性的组合)按照相同的值 进行分组,每个组内做聚合运算(Sum ,Count这些)

深度学习相关

数据库 效率 一致性 显式结构(确定的语法匹配)
深度学习 高维 不确定 隐式结构(多模态数据的语义匹配)

多模态语义的层次组合结构表示
模态 每一种信息的来源或者形式都可以叫模态
语义 就是语言蕴含的意思

流行结构 可以降维的高位数据 可以进行映射 逆映射
eg:圆用二维直角坐标有冗余,极坐标一个参数搞定。降维又不失特性,所以可以更好的得到数据的本质和特征。
1.高维复杂函数的近似 2.层次结构特征抽取

数据的语义关系,相似和相关关系的表示
统计,logic是确定性的表示,深度学习可以表示不确定性,相似,相关。
数据库对深度学习
大量的训练集可以优化深度学习的模型,但是代价会变大。所以对数据库系统的优化经验可以用于对深度学习数据集的优化。
1.优化调度。利用数据库中对事务执行的调度优化的思路,可以提高深度学习中独立问题的计算速度。如 数据库中用代价模型来评价调度的好坏,深度学习也可以通过代价模型来找到最好的计算次序。
2.存储管理。利用数据库中缓存的思路,减少深度学习在大量数据集情况下的压力。利用数据库中日志的思路对深度学习进行动态分析。引入垃圾回收机制优化GPU存储管理。
3.并发一致:数据库技术可以提供灵活的不同级别的一致性,可用于深度学习的分布式训练。
深度学习对数据库
1.自然语言查询接口 RNN在自然语言处理,自然语言转换为SQL语句
2.优化查询执行计划:通过学习大量的SQL语句以及最优执行顺序对新输入的SQL查询语句产生相似的最优解。
3.对数据库中存储的海量数据进行特征提取,可以根据数据的特征进行更好更合理的数据存储方案,索引的建立以及存储方案。

这是数据库的具体的锁。
共享锁 加了之后其他事务只能读
排他锁 加了之后其他人不能读不能写

下面这倆是概念上的乐观和悲观。
乐观锁 是应用系统层面和数据的业务逻辑层次上的。其实是一种检查冲突的机制 ,用程序处理并发,一般用时间戳(提前读取,事后对比)和版本控制来实现,CAS有点像,commit时检查下自己读的数据跟之前比被改了没,被改了就重新来。(这个检查的过程必须加上锁)
悲观锁 悲观锁: 完全依赖于数据库锁的机制实现的,在数据库中可以使用Repeatable Read的隔离级别(可重复读)来实现悲观锁,它完全满足悲观锁的要求(加锁)。
它认为当某一用户读取某一数据的时候,其他用户也会对该数据进行访问,所以在读取的时候就对数据进行加锁, 在该用户读取数据的期间,其他任何用户都不能来修改该数据,但是其他用户是可以读取该数据的, 只有当自己读取完毕才释放锁。(加个上面说的具体的锁,共享锁)

ACID

A 原子性 一个事务内的所有操作,要么全做,要么全不做
C 一致性 数据库从一个一致性状态到另一个一致性状态
I 一个事务在执行期间,对于其他事务来说是不可见的
D 事务一旦成功提交,则就会永久性的对数据库进行了修改
C:

  • 单机数据库下的一致性
    原子一致性: 拿最经典的转账举例, 一个事务是A向B转100块钱, 事务的原子性保证了要么全部执行, 要么全部不执行, 不存在A扣了钱, B没有加钱的情况. 这里, 谈讨原子一致性时有个前提, 即只有一个事务, 当涉及到并发时, 仅仅有原子性是无法保证一致性的.
    并发一致性: 当有并发事务的情况下, 事务之间的操作可能产生互相影响, 如两个事务同时修改一份数据, 可能导致一个事务的修改覆盖了另一个事务的修改. 事务的隔离性保证了并发的一致性, 但事务有四种隔离级别, 而不同隔离级别的选择对一致性的保证程度是不同的, 如Read Uncommited下, 一个事务可能读到另一个事务还未提交的数据.
  • 分布式数据库下的一致性
    两次提交等等 保证几个库的并发一致性

四种隔离级别和并发中会出现的问题

未提交读 一个事务能读到另一个并发事务还未提交的更改的数据 事务之间的数据是相互可见的
提交读 一个事务的写入删除修改只有提交后才能被其他事务读取到(读不加锁,写入修改删除加锁)
可重复读 保证了在同一个事务之中,多次读取相同的记录的值的结果是一致的。(乐观锁原理的多版本控制MVCC( 只在提交读和可重复读中用,未提交读无关事务,随便互相读;可串行话读在读时也要加锁)
MVCC 大部分读不加锁! select这种读不加锁 update insert这种处理当前数据(度进来再处理)要加锁。
可串行化 在串行调度中,属于同一事务的指令紧挨在一起。对于有n的事务的事务组,可以有n!个串行调度。可串行化:一个调度的执行必须等价于一个串行调度的结果 mysql是实现是 读是加共享锁,写修改删除时加互斥锁,读写分离互斥。
读取的每一行数据上都进行加锁。读就加锁!写加更牛的锁!

丢失更新 当两个或者多个事务同时对某一数据进行更新的时候,事务B的更新可能覆盖掉事务A的更新,导致更新丢失;
乐观锁的方法 版本控制;悲观锁的方法:提交的时候检查下数据变了没,变了就取消更新。

脏读 事务可以读取未提交的数据 ,隔离级别提升到提交读
不可重复读 提升至可重复读 读取时候不允许其他事务修改该数据
幻读 当某个事务在读取某个范围内的记录的时候,另外一个事务在这个范围内增加了一行,当前一个事务再次读取该范围的数据的时候就会发生幻行,. 针对的是数据的插入insert
加范围锁,或者提升到可串行化 , MySQL中InnoDB 和 XtraDB 利用(多版本并发控制)解决了幻读问题。

事务调度和可串行化问题

多线程 多线程 密集io访问和cpu计算
不能磁盘直接改,寄存器里改完了放回磁盘。

在应用上 事务映射成线程 会产生序列化的问题 (多线程的问题)
多线程 并发做的和一次串行的做的结果一样

并发的目的 改善系统的资源利用率和吞吐率(单位时间内处理的事务数)

单库事务控制 预写日志
多库事务控制 两次提交
事务的执行顺序是一个调度,表示事务的指令在系统中执行的时间顺序

事务的调度:包含所有事务的操作指令(全)
一个事务中的指令顺序不变(内部顺序稳定)
(两段锁)
串行化对数据备份和恢复很重要。
串行:在串行调度中,属于同一事务的指令紧挨在一起。对于有n的事务的事务组,可以有n!个串行调度。

可串行化:一个调度的执行必须等价于一个串行调度的结果
具体实现 冲突可串行化 视图可串行化
冲突:两条指令是不同事务对同一数据项的操作,且其中至少有一个write指令,则两个指令是冲突的。
非冲突指令交换次序不会影响调度的顺序
冲突可串行化:一个调度和一个串行调度是冲突等价的,则称该调度为冲突可传性化的
充分条件!

判定:优先图
B写之前A读或写都有A-》B
B读之前A写了也有A-》B
优先图里有A-》B 那么等价与这个调度的任何可串行化调度 A都得在B前面
优先图有环 就是不可串行的

视图可串行化 某个调度视图等价与一个串行调度

视图等价
读的初始值 都这样
读的值由别的事务产生 都这样
最后的write 都这样

冲突可串行化 一定是 视图可串行的 (后面又一堆盲目写)

MYSQL实现可串行化:它的加锁实现是读取的时候加共享锁,修改删除更新的时候加排他锁,读写互斥,但是并发能力差。

幻读的时候MYSQL加next-key 修改数据的时候加行锁,添加删除的时候加间隙GAP锁。 这一起叫next-key锁 ,相当于一种范围锁吧 这个范围里都不让你写

两段锁 加锁 解锁 分成两段 若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
产生死锁可能 一次封锁=法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁。

数据挖掘

逻辑归纳 已知到为止
reasoning 蕴含关系
inference 隐藏关系

效率,可用,可扩展

单个数据模型的查询的度量叫效率了

  • 查询优化
  • 缓存
  • 事务并发
  • 存储访问 物理怎么访问磁盘好 簇集设计(剧集存储!),索引,分区设计。
    对整个系统而言就是吞吐量(单位时间处理事务的数量)
    可扩展性 可以增加机器数量来提高系统吞吐率

可用性 快 安全 能用
三种查询都行 恢复备份 可靠 快

可扩展性!
水平可扩展 加几个库还能用(分布式,镜像,主库从库两次提交)
垂直可扩展 换个性能更高的库还能用

模型-》算法-》系统

关系模型-》实现了关系模型里的算法-》关系数据库系统

no pattern数据的分析

Mining 数据挖掘 用机器学习,统计学,数据库的交叉方法从海量数据集中发现数据中隐藏的特征和信息,发现数据的模式的计算过程,反映的是数据层面的规律。
举个例子就是一个大型连锁商场的海量销售记录中,可以对啤酒,奶粉这些商品的销量进行各种类似平均销量进行统计和分析,这些是传统的数据的分析;但是通过对这些数据进行深层次的发掘,找到啤酒和奶粉放在一起可以提高啤酒销量这个隐藏的对商家来说有巨大作用的规律,就是数据挖掘做的事。通过分析可以知道,老婆让丈夫去商场买奶粉时看到旁边有啤酒会顺手买一罐。

Analyzing 数据分析 用适当的统计方法对大量数据进行分析,提取有用信息,形成结论,而对数据加以详细研究和概括总结的过程。
Monitering 数据监测 监测管控数据是否合理和正常 不正常报警
Reasoning 推理 从已知到为止 蕴含关系

数据挖掘和数据分析

“数据分析”的重点是观察数据,而“数据挖掘”的重点是从数据中发现“知识规则”KDD(Knowledge Discover in Database)。
“数据分析”得出的结论是人的智力活动结果,而“数据挖掘”得出的结论是机器从学习集(或训练集、样本集)发现的知识规则。
“数据分析”得出结论的运用是人的智力活动,而“数据挖掘”发现的知识规则,可以直接应用到预测
“数据分析”不能建立数学模型,需要人工建模,而“数据挖掘”直接完成了数学建模。如传统的控制论建模的本质就是描述输入变量与输出变量之间的函数关系,“数据挖掘”可以通过机器学习自动建立输入与输出的函数关系,根据KDD得出的“规则”,给定一组输入参数,就可以得出一组输出量。

举例子 重要!

有一些人总是不及时向电信运营商缴钱,如何发现它们?
数据分析:通过对数据的观察,我们发现不及时缴钱人群里的贫困人口占82%。所以结论是收入低的人往往会缴费不及时。结论就是设置更多可供选择的套餐,给低收入群体更低资费更少的服务,减少功能。

数据挖掘:通过对不及时交钱人群的收入、居住地等所有数据,使用机器学习算法自行发现深层次的原因。挖掘出,原因可能是,家住在五环以外的人,由于环境偏远不及时缴钱。结论就需要在偏远地区适当增加营业厅,而不是降低资费。

persistent data & trancient data的区别是 是否store
trancient 暂时数据 不存储 一般存在于在一个session会话中,会话关闭就没了。

Query&IE/IR
Query 查询 对结构化的
IE/IR 信息检索 对非结构化的

centralized 中心化 有DA 数据库管理员
decentralized 去中心化 没有管理者 共同参与和平权

你可能感兴趣的:(数据库)