数据库系统概念阅读笔记
2017-09-25
1,2
6
3,4
7,8
5
定义
DBMS 是一个由互相关联的数据集合和一组用以访问这些数据的程序组成。这个数据几个通常称作数据库。
数据库系统的目标,解决了使用文件处理系统会出现的
- 数据的冗余和不一致:重复存储,更新不同步
- 数据访问困难:每次查询需要开发
- 数据孤立:分散在不同文件
- 完整性问题:约束复杂
- 原子性问题
- 并发访问异常
- 安全性问题:权限控制
数据抽象的层次:物理层、逻辑层、视图层,物理层详细描述复杂的底层数据结构,逻辑层描述数据库中存储什么数据以及数据间存在的关系, 视图层只描述数据库的整个部分
特定时刻存储在数据库中的信息的集合称作数据库的一个实例(instance),数据库的总体设计称作数据库模式。
数据模型是一个描述数据、数据联系、数据语义以及一致性约束的概念工具的几何。有四类:
- 关系模型: 用表的几何来是表示数据和数据间的联系
- 实体-联系模型:数据表和关系表的概念
- 基于对象的数据模型
- 半结构化数据模型
存储管理器是数据库系统中负责在数据库中存储的底层数据与应用程序以及向系统提交的查询之间提供接口的部件,负责与文件管理器进行交互。 原始数据通过操作系统提供的文件系统存储在磁盘上。存储管理器将各种DML语句翻译为底层文件系统命令。存储管理器负责数据库中数据的存储、检索和更新。
存储管理部件:
- 权限及完整性管理器(authorization and integrity manager):检测是否满足完整性约束,并检查试图访问数据的用户权限
- 事务管理器(transaction manager):保证即使发生了故障、数据库也保持在一致的状态,并保证并发事务的执行不发生冲突
- 文件管理器(file manager):管理磁盘存储空间的分配,管理用于表示磁盘上所存储信息的数据结构
- 缓冲区管理器(buffer manager): 负责将数据从磁盘上取到内存中来,并决定哪些数据应被缓冲存储在内存中。缓冲区管理器是数据库系统中的一个关键部分,因为它是数据库可以处理比内存更大的数据。
存储管理器实现了几种数据结构,作为系统物理实现的一部分:
- 数据文件(data files):存储数据库自身
- 数据字典(data dictionary): 存储关于数据库结构的元数据,尤其是数据库模式
- 索引(index):提供对数据项的快速访问。即提供了指向包含特定值的数据的指针
查询处理器组件:
- DDL 解释器(DDL interpreter):解释DDL语句并将这些定义记录在数据字典中
- DML 编译器(DML compiler):将查询语言中的 DML 语句翻译为一系列查询执行引擎能理解的低级指令,并进行查询优化。
- 查询执行引擎(query evaluation engine):执行由 DML 编译器产生的低级指令
事务管理:
要么完成要么不发生的要求称为原子性(atomicity)。正确性的要求称作一致性(consistency)。保持的要求称作持久性(durability)。
事务是数据库应用中完成单一逻辑功能的操作集合,每一个事务是一个既具有原子性又具有一致性的单元。事务的定义应使之能保持数据库的一致性。
为了保证原子性,失败的事务必须对数据库状态不产生任何影响,即必须恢复到该失败事务开始执行以前的状态。
并发控制管理器(concurrency-control manager) 控制并发事务间的相互影响,保证数据库的一致性,事务管理器包括并罚控制管理器和恢复管理器
形式化查询语言
关系代数是一种过程化查询语言,包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。
关系代数的基本运算:选择、投影、并、集合差、笛卡尔乘积、更名、集合交、自然连接和赋值
选择、投影、更名为一元运算
选择运算
选择运算选出满足给定谓词的元组,用小写希腊字母 sigma 表示选择,谓词写作 sigma 的下标。参数关系在 sigma 后的括号中。 通常允许在选择谓词中进行比较,使用的是 = != < <= > >= ,可以用 and or nor 将多个谓词合并为一个较大的谓词
示例
选择谓词中可以包括两个属性的比较。这里的 select 对应 SQL 中使用的 where
select
Choose a subset of the tuples from a relation that satisfies a selection predicate
投影运算 projection
Generate a relation with tuples that contains only the specified attributes
投影返回作为参数的关系,但把某些属性排除在外
并运算
必须保证做并运算的关系是相容的。要使 r 并 s 有意义,要满足以下两个条件
- 关系 r 和 s 必须是同元的,即他们的属性数目必须相同
- 对所有的 i, r 的第 i 个属性的域必须和 s 的第 i 个属性的域相同
差运算
r - s 结果即一个包含所有在 r 中而不在 s 中的元组的关系, r 和 s 也得是同元的
笛卡尔积运算
更名运算
对给定关系代数表达式 , 表达式
返回表达式 的结果,并把名字 赋给了它。
集合交运算
用一对集合差运算实现
自然连接运算
可以将某些选择和笛卡尔积运算合并为一个运算
赋值运算
外连接运算
左外连接、右外连接、全外连接
扩展的关系代数运算
广义投影,通过允许在投影列表中使用算数运算和字符串函数等来对投影进行扩展。
聚集
聚集函数输入值的一个汇集,将单一值作为结果返回 sum avg min max
元组关系演算
“它是所有满足如下条件的元组 t 的集合:在关系 instructor 中存在元组 s 使 t 和 s 在属性 ID 伤的值相等,且 s 在属性 salary 上的值大于 80000 美元”
表达式的安全性
P的域(用 dome(P)表示)是P所引用的所有值的集合。它们既包括P自身用到的值,又包括P中涉及的关系的元组中出现的所有值。因此P的域是P中显示出现的值 及名称出现在P中那些关系的所有值的集合。
域关系演算
SQL 数据定义
SQL 的 DLL 不仅能够定义一组关系,还能够定义每个关系的信息,包括:
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
基本类型
- char(n): 固定长度的字符串,指定长度 n
- varchar(n): 可变长度的字符串,用户指定最大长度 n
- int: 整数类型
- smallint: 小整数类型
- numeric(p, d): 定点数,精度由用户指定
- real, double precision: 浮点数与双精度浮点数
- float(n): 精度至少为 n 位的浮点数
char 和 char 及 varchar 比较的区别
基本模式定义
create table r
(A1 D1,
A2 D2,
...
An Dn,
< 完整性约束1 >,
...,
< 完整性约束n >);
其中 r 是关系名,每个 A_i 是关系 r 模式中的一个属性名, D_i 是属性 A_i 的域,既 D_i 制定了 属性 A_i 的类型以及可选的约束, 用于限制所允许的 A_i 取值的集合
约束有 primary key、foreign key、not null 约束
SQL 禁止破坏完整性约束的任何数据库更新
drop 和 delete 比较,delete 保留关系,删除所有元组,前者不仅删除 r 的所有元组, 还删除 r 的模式
alter table 为已有关系增加属性
SQL 查询的基本结构
单关系查询
SQL 允许在 where 字句中使用逻辑连词 and 、or 和 not,逻辑连词的运算对象可以是包含比较运算符 <、<=、>、>=、= 和 <> 的表达式, SQL 允许我们使用比较运算符来比较字符串、算术表达式以及特殊类型,如日期类型
多关系查询
- select 子句用于列出查询结果中所需要的属性
- from 子句是一个查询求职中需要访问的关系列表
- where 子句是一个作用在 from 子句中关系的属性上的谓词
典型的 SQL 查询形式:
select A1, A2, ..., Am
from r1, r2, ..., rm
where P;
每个 Ai 代表一个属性,每个 ri 代表一个关系。P 是一个谓词, 省略 where 子句则 P 为 True
查询运算顺序: 首先是 from,然后是 where,最后是 select
from 子句定义了一个在该子句中所列出关系上的笛卡尔乘积。迭代过程如下:
for each 元组t1 in 关系 r1
for each 元组t2 in 关系 r2
...
for each 元组tm in 关系 rm:
把 t1, t2, ..., tm 连接成单个元组 t
把 t 加入结果关系中
此结果关系具有来自 from 子句中所有关系的所有属性。由于在关系 ri 和 rj 中可能出现相同的属性名,需要在属性名前 加上关系名作为前缀,表示该属性来自哪个关系
SQL 查询的含义:
- 为 from 字句中列出的关系产生笛卡尔积
- 在步骤1的结果上应用 where 子句中指定的谓词
- 对于步骤2结果中的每个元组,输出 select 子句中指定的属性
自然连接
自然连接运算作用于两个关系,并产生一个关系作为结果,自然连接至只考虑 在两个关系模式中都出现的属性上取值相同的元组对
join … using 运算中需要给定一个属性名列表,其两个输入中都必须指定名称的属性。
更名运算
old_name as new_name
字符串运算
- 百分号(%): 匹配任意字串
- 下划线: 匹配任意一个字符
模式是大小写敏感的
order_by 子句默认使用升序
集合运算
- 并: union
- 交: intersect
- 差: except
聚集函数
- 平均值: avg
- 最小值: min
- 最大值: max
- 总和: sum
- 计数: count
分组聚集
在 group by 子句中的所有属性上取值相同的元组将被分在一个组中 需要保证出现在 select 语句中但没有被聚集的属性只能是出现在 group by 子句中的那些属性
包含聚集、group_by 或 having 子句的查询的含义可通过下述操作序列本来定义:
- 与不带聚集的查询情况类似,最先根据 from 子句来计算出一个关系
- 如果出现了 where 子句,where 子句中的谓词将应用到 from 子句的结果关系上
- 如果出现了 group_by 子句,满足 where 谓词的元组通过 group_by 子句形成分组
- 如果出现了 having 子句,它将应用到每个分组上;不满足 having 子句谓词的分组将被抛弃
- select 子句利用剩下的分组产生出查询结果中的元组,即在每个分组上应用聚集函数来得到单个结果元组
聚集函数根据以下原则处理空值: 除了 count(*) 以外所有的聚集函数都忽略输入集合中的空值.
嵌套子查询
连接词 in 测试元组是否是集合中的成员
短语 “至少比某一个要大” 在 SQL 中用 >some 表示
exists 结构在作为参数的子查询非空时返回 true 值
来自外层查询的一个相关名称可以用在 where 子句的子查询中,叫相关子查询
视图
事务
事务由查询或更新语句的序列组成。
一个事物或者在完成所有步骤后提交其行为,或者在不能完成其所有动作的情况下回滚其所有动作,通过这种方式数据库提供了对事务具有原子性 的抽象,要么事务的所有影响被反映到数据库中,要么任何影响都没有。
默认每个 SQL 语句自成一个事务,且一执行完就提交。
完整性约束
完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。
not null 约束:not null 声明禁止在该属性上插入空值。 unique 约束:即在关系中没有两个元组能在所有列出的属性上取值相同 check 子句:check(P) 子句制定一个谓词 P,关系中的每个元组都必须满足谓词P
事务中对完整性约束的违反
复杂 check 条件与断言
SQL 数据类型与模式
- date: 日历日期 ‘2001-04-25’
- time: 一天中的时间 ‘09:30:00’
- timestamp: date 和 time 的组合
cast e as t 可以将一个字符串(或字符串表达式)e转成类型t, 其中 t 是 date, time, timestamp 中的一种
可以用 extract(field from d) 从 date 或 time 值 d 中提取出单独的域, 域可以是 year, month, day, hour, minute 或者 second 中的一种
current_data,current_time, localtime, current_timestamp
创建索引
在关系的属性上所创建的索引是一种数据结构,它允许数据库系统高效地找到关系中哪些在索引属性上取给定值的元组,而不用 扫描关系中的所有元组。
创建一个与现有表模式相同的表: create table p like m
授权
grant 语句用来授予权限
grant <权限列表>
on <关系名或视图名>
to <用户/角色列表>
权限的传递
权限的收回
数据库设计和 E-R 模型(学不来学不来)
Entity-Relationship
实体:是现实世界中可区别于所有其他对象的一个事物或者对象。实体集势相同类型的一个实体集合
联系是多个实体间的相互关联,联系集是相通类型联系的集合
关系数据库设计
一个域是原子的,如果该域的元素被认为是不可分的单元,我们称一个关系模式 R 属于第一范式,如果 R 的所有属性的域都是原子的
函数依赖理论
闭包,正则覆盖,无损分解,保持依赖,六种范式
存储和文件结构
物理存储介质概述:
- 高速缓冲存储器