第1章 引论
1.1 数据管理的发展
- 数据管理:对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题。
- 数据密集型应用特点 (重点):
- 数据量大(TB级),通常内存无法容纳,需存于辅存;
- 数据为持久数据(persistent data);
- 数据被多个应用程序共享(如MIS、银行、办公系统、网络数据服务等)。
- 数据管理三阶段 (重点):
- 人工管理
- 文件系统
- 数据库系统
- 文件系统的缺点 (重点):
- 编写应用程序不方便;
- 数据冗余;
- 文件结构修改将导致应用程序修改,维护工作量大;
- 不支持并发访问;
- 数据规范化与标准化较难达到。
- 数据库与文件系统的根本区别 :数据结构化 (重点)
→ 不仅描述数据本身,还描述数据之间的联系。 - 数据库系统特征:统一管理和共享数据。
1.2 数据库系统(重点)
1.2.1 数据库系统构成
- 组成 :
- 数据库(DB)
- 数据库管理系统(DBMS)及其开发工具
- 应用系统
- 数据库管理员(DBA)
- 用户
1.2.2 DBMS主要功能(重点)
- 提供高级的用户接口
- 查询处理和优化
- 数据目录管理
- 并发控制
- 恢复功能
- 完整性约束检查
- 访问控制
1.2.3 硬件平台要求
- 足够大的内存(存放OS、DBMS核心、缓冲区、应用程序)
- 足够大的磁盘等直接存取设备(存放数据库和备份)
- 高通道能力(提高数据传送率)
1.2.4 软件组成
- DBMS(核心)
- 支持DBMS的操作系统
- 具有数据库接口的高级语言及其编译系统
- 以DBMS为核心的应用开发工具(如第四代语言、应用生成器)
- 特定应用环境开发的数据库应用系统
1.2.5 人员角色(重点)
- 数据库管理员(DBA)职责 :
- 决定数据库内容与结构
- 决定存储结构与存取策略
- 定义安全性与完整性约束
- 监控使用和运行
- 定期重组织(reorganization)以提升性能
- 根据需求变化进行重构(restructuring)
- 系统分析员与数据库设计人员 :
- 负责需求分析、规范说明、软硬件配置、概要设计
- 数据库设计人员负责数据确定和各级模式设计(常由DBA兼任)
- 应用程序员:设计、编写、调试、安装应用模块
- 最终用户(End User):通过接口(浏览器、菜单、表格、图形、报表)使用数据库
1.3 数据、数据模型和数据模式(重点)
1.3.1 数据与数据库
- 数据:对事物描述的符号记录,需解释/处理才成为信息。
- 数据库:某单位所涉数据的综合,反映数据本身及其联系。
1.3.2 数据模型(重点)
- 定义:现实世界数据特征的抽象,是数据库系统的核心和基础。
- 应满足三方面要求 :
- 能较真实模拟现实世界
- 易于人理解
- 便于在计算机上实现
- 三级模型分类 :
- 概念数据模型:与DBMS无关,面向用户,语义模型(如E-R图)
- 逻辑数据模型:与DBMS有关,面向用户+实现
- 物理数据模型:与DBMS、OS、硬件有关,描述存储结构(块、指针、索引等)
1.3.3 数据模型组成要素(重点)
- 数据结构 :
- 描述对象类型集合(静态特性)
- 包括:
- 与数据类型、内容、性质相关的对象(如关系模型中的域、属性、关系)
- 与数据之间联系相关的对象(如网状模型中的系型)
- 按数据结构类型命名模型(层次/网状/关系模型)
- 数据操作 :
- 对对象实例允许执行的操作(动态特性)
- 主要包括:检索、更新(插入、删除、修改)
- 需定义操作含义、符号、规则、语言
- 完整性约束条件 :
- 一组完整性规则集合
- 限定数据库状态及状态变化,保证数据正确、有效、相容
1.3.4 数据模式(重点)
- 定义:以一定数据模型对一个单位的类型、结构及其关系的描述。
- 型 vs 值 :
- 型(schema):框架
- 值(instance):具体实例
- 数据模型 vs 数据模式 :
- 数据模型是工具(如C语言)
- 数据模式是用该工具对具体对象的描述(如C程序)
- 三级模式结构 (重点):
- 概念模式:用逻辑数据模型对单位全局数据的描述(整个数据库逻辑结构)
- 外模式:用逻辑数据模型对用户所用部分数据的描述(局部模式,因用户而异)
- 内模式:用物理数据模型对数据存储结构的描述(物理结构)
- 数据目录:存储概念模式、外模式、内模式,DBMS通过它管理和访问模式。
1.4 数据库应用
- 基本任务 :
- 数据库系统规划
- 数据库设计(需考虑:信息需求、处理需求、DBMS特性、硬件/OS特性)
- 数据库建立
- 数据库运行、管理与维护
- 数据库扩充与维护
1.5 数据库技术的发展(重点)
- 第一代数据库系统:20世纪70年代,层次和网状数据库(如IMS、IDS)
- 第二代数据库系统:关系数据库系统(Codd 1970提出关系模型)
- 第三代数据库系统 :
- 面向对象数据模型
- 多学科融合:
- 分布式数据库
- 工程数据库
- 演绎数据库
- 知识数据库
- 时态数据库
- 空间数据库
- Internet时代数据库技术 :
- 数据仓库、OLAP、数据挖掘、电子商务
- Web信息检索、Web数据集成与共享、数据流技术等
重点章节总结
- 重点章节:1.1(数据管理演变)、1.2(数据库系统构成)、1.3(数据模型与模式)
- 核心概念 (必掌握):
- 数据结构化
- DBMS功能
- 三级模式(外/概/内)
- 数据模型三要素(结构、操作、完整性)
- 数据独立性基础(隐含在三级模式中)
- DBA职责
- 数据密集型应用特征
第2章 数据模型
2.1 层次数据模型
基本概念(重点)
- 定义 :用树型(层次)结构表示实体类型及实体间联系的数据模型。
- 记录和字段 :
- 记录:描述事物或事物间关系的命名数据单位,也是存储单位;
- 字段:记录的组成部分,只能是简单数据类型(整数、实数、字符串等)。
- 双亲子女关系(PCR) :
- 表示两个记录型之间的1:N关系;
- 每个子女记录有且仅有一个双亲记录。
- 层次数据模式 :
- 由 PCR 构成;
- 除根外,所有记录型必须有唯一双亲;
- 子女按从左到右排序。
虚拟记录(重点)
- 用于表示非层次关系(如 M:N、多元关系);
- 为避免冗余,用指针代替重复记录,称为虚拟记录(virtual record);
- 虚拟记录用下标 v 表示,指针用虚线箭头表示;
- 虚拟记录不能为根记录。
层次数据的线性表示
- 存储器是线性的 → 层次树需转换为层次序列;
- 采用先序遍历生成层次序列作为存储次序。
层次模型的约束(重点)
- 非根记录不能离开双亲记录而孤立存在;
- 任何记录(包括虚拟)只允许有一个双亲;
- 虚拟记录指针必须指向实际存在的记录,被指向记录不得删除;
- 虚拟记录不得为根记录。
优缺点
- 优点 :记录间联系通过指针实现,查询效率高(针对层次结构);
- 缺点 :
- 只能表示 1:N 联系;
- 表示非层次关系需虚拟记录,复杂且用户不易掌握;
- 层次顺序严格 → 查询和更新复杂,应用程序编写复杂;
- 模式描述语言复杂,数据独立性差。
2.2 网状数据模型
基本概念(重点)
- 定义 :用有向图(网络结构) 表示实体及联系的数据模型;
- 结点是记录类型,箭头表示从箭尾到箭头的联系。
系(Set)(重点)
- 表示两个记录型间的 1:N 关系;
- "1"端为首记录(owner),"N"端为属记录(member);
- 系是命名的,有型和值之分;
- 多属系:一个系有多种类型属记录(如转账系含存款帐、提款帐)。
M:N 联系的处理
- 引入联系记录(LINK),将 M:N 转为两个 1:N;
- 例如:学生-课程 M:N → 引入 LINK,形成 S--LINK(1:M)、C--LINK(1:N)。
系的实现
- 采用链式结构:首记录指针 + 前向/后向指针构成系链。
系籍约束(重点)
- 插入属记录时的约束 :
- AUTOMATIC:自动加入系;
- MANUAL:不自动加入。
- 记录存在性约束 (三种留置约束):
- OPTIMAL(随意):属记录可脱离系存在(如"系--学生");
- MANDATORY(强制):属记录不能游离(如"部门--职工");
- FIXED(固定):不能游离,也不能转系(如"职工--家属")。
- 删除规则 :
- 首记录删除时,按上述约束处理属记录。
优缺点
- 优点:比层次模型更灵活,可自然模拟层次与非层次结构;
- 缺点 :应用程序编写复杂,须熟悉逻辑结构;
- 目前已被关系系统取代。
2.3 关系数据模型(重点章节)
基本概念(重点)
- 核心思想 :用表格结构 表达实体集,用外键表示实体联系;
- 与层次/网状最大差别 :用键 而非指针导航数据。
1. 属性和域
- 属性:描述事物特征;
- 域:属性的取值范围;
- 要求 :
- 所有属性必须是不可再分的原子数据(1NF);
- 允许属性值为 NULL(空值是标记,非实际值)。
2. 关系和元组
- 关系 R = (A₁/D₁, A₂/D₂, ..., Aₙ/Dₙ),n 为目;
- 元组 t = ⟨v₁, v₂, ..., vₙ⟩,vᵢ ∈ Dᵢ;
- 关系可视为二维表 :
- 行 = 元组;
- 列 = 属性;
- 特点 :
- 元组无序,但不能重复;
- 属性无序,但不能同名。
3. 键(重点)
- 候选键(键) :属性或属性组能唯一决定其他所有属性 ,且无真子集具有此性质;
- 超键:候选键的超集;
- 主键:从候选键中选定的一个;
- 全键:由所有属性组成的键(如 SUPPLY(SNAME, PNAME, JNAME));
- 主属性:属于任一候选键的属性;
- 非主属性:不属于任何候选键的属性;
- 外键:引用其他关系(或本关系)主键的属性。
2.3.2 完整性约束(重点)
- 域完整性约束 :
- 属性值必须在域内;
- 是否允许为空由语义决定(如成绩 0~100)。
- 实体完整性约束 :
- 主键不能为空 且唯一。
- 引用完整性约束 :
- 外键要么为 NULL ,要么等于被引用关系中某元组的主键值。
- 一般性完整性约束 :
- 用户自定义的语义约束;
- 当前 DBMS 不能全面支持。
2.3.3 关系代数操作(重点)
关系专用操作
- 选择(σ) :
- 单目运算;
- σ<条件>®:选出满足条件的元组;
- 可嵌套:σ₁(σ₂®) = σ₁∧₂®。
- 投影(Π) :
- 单目运算;
- Π<属性表>®:选出指定列,自动去重;
- 可与选择组合使用。
集合操作(并兼容要求)
- 并(∪) 、交(∩) 、差(−);
- 要求:两关系同目 且对应属性域相同(并兼容);
- 交可用差表示:A ∩ B = A − (A − B)。
笛卡尔积(×)
- R × S = {⟨t, g⟩ | t ∈ R, g ∈ S};
- 结果目数 = nr + ns,元组数 = |R| × |S|;
- 同名属性需加关系名限定。
连接(∞)
- R ∞<条件>S = σ<条件>(R × S);
- 等连接:θ 全为 "=";
- 自然连接 :等连接 + 去除重复属性;
- 外连接 (扩展):
- 左外、右外、全外;
- 保留不匹配元组,空缺填 NULL。
除法(÷)(重点)
- R(X,Y) ÷ S(Y) = Πₓ® − Πₓ((Πₓ® × S) − R);
- 语义:找出 X 值,其对应的 Y 值包含 S 中所有 Y;
- 示例:供应所有指定仓库的供应商。
完备性
- 操作集 {σ, Π, ∪, −, ×} 或 {σ, Π, ∪, −, ∞} 是关系完备的;
- 当前 DBMS 还支持排序、分组等扩展操作。
2.3.4 元组关系演算
- 形式:{t[⟨属性表⟩] | P(t)};
- t 为元组变量,P(t) 为谓词;
- 与关系代数等价,是关系完备的;
- 示例:
- 投影:Π_AB® = {t[AB] | t ∈ r};
- 选择:σ_F® = {t | t ∈ r ∧ F}。
2.3.5 域关系演算
- 形式:{⟨x₁,...,xₙ⟩ | P(x₁,...,xₙ₊ₘ)};
- 变量取值为域,非关系;
- 示例:{⟨x,y⟩ | (∃z)(GRADE(x,y,z) ∧ z<60)}。
2.4 对传统数据模型的评价
共同特点
- 继承文件系统的记录、字段概念;
- 物理层借鉴索引、散列等存取方法;
- 提供统一数据模型和数据库语言;
- 在记录基础上定义结构、约束、操作。
不足(重点)
- 以记录为基础,不能很好面向用户和应用;
- 不能以自然方式表示实体间联系;
- 语义贫乏;
- 数据类型少,难满足应用需求。
2.5 E-R 数据模型(重点)
基本思想
- 1976 年由 P. Chen 提出;
- 作为概念数据模型 ,面向现实世界,非面向实现;
- 用于数据库概念设计。
基本概念(重点)
- 实体(Entity) :
- 可相互区别、被识别的事物或概念;
- 实体集(如 Es = {e | e 是学生})。
- 属性(Attribute) :
- 描述实体特征;
- 可为简单属性 或组合属性(如地址=省+市+区)。
- 实体键 :
- 能唯一识别实体的属性或属性组。
- 联系(Relationship) :
- 实体间的关系;
- 类型:1:1、1:N、M:N;
- 参与度 :(min:max),如 (3:6) 表示学生选课数在 3~6 门;
- min=0:非强制参与;
- min>0:强制参与。
- 弱实体 :
- 不能单独存在,依附于另一实体(如"家属"依附"职工");
- 其主键包含所依附实体的主键。
E-R 图
- 用图形表示实体、属性、联系;
- 只关心数据内容与关系,不关心存储与 DBMS。
扩充 E-R(EER)
- 特殊化与普遍化 :
- 特殊化:从一般到特殊(如"学生"→"研究生");
- 普遍化:从特殊到一般;
- 子实体继承父实体的属性和联系。
- 聚集(Aggregation) :
- 将联系视为新实体,其属性 = 参与实体属性 + 联系属性。
- 范畴(Category) :
- 由不同类型实体组成的实体集(如"人"可为"雇员"或"学生")。
范式理论(重点)
第一范式(1NF)
- 要求:每个属性值都是不可再分的最小数据单位;
- 示例:电话号码若含多个,需拆分为单位电话、住宅电话。
第二范式(2NF)
- 要求:所有非主属性 完全依赖于任意一个候选键;
- 问题:部分依赖 → 数据冗余、更新异常、插入异常;
- 示例:SCI(SNO, CNO, GRADE, CREDIT)
- CREDIT 仅依赖 CNO(部分依赖组合键 (SNO,CNO));
- 分解为 SC1(SNO,CNO,GRADE) + C2(CNO,CREDIT)。
第三范式(3NF)
- 要求:所有非主属性对候选键不存在传递依赖;
- 示例:S1(SNO, SNAME, DNO, DNAME, LOCATION)
- SNO → DNO → LOCATION(传递依赖);
- 分解为 S(SNO,SNAME,DNO) + D(DNO,DNAME,LOCATION);
- 外键 DNO 不可省略,否则失去联系。
重点章节总结
- 核心重点 :
- 关系数据模型(属性、元组、键、完整性约束)
- 关系代数操作(选择、投影、连接、除法)
- 范式理论(1NF、2NF、3NF 的定义、问题、分解方法)
- E-R 模型(实体、联系、参与度、弱实体)
- 次重点 :
- 层次/网状模型的基本结构与约束
- 关系演算(元组、域)的基本形式
- 传统模型的不足
第3章 数据库语言
3.1 数据库的用户接口
基本概念
- DBMS 提供操作命令和语言,构成用户与数据库的接口。
- 数据库语言(database language):
- 用于查询、增删改数据,定义/修改数据模式;
- 不是计算完备语言,不能独立编写应用程序;
- 通常嵌入到高级语言 (如 C)中,后者称为宿主语言。
数据库语言 vs 宿主语言(重点)
| 项目 | 数据库语言 | 宿主语言 |
|---|---|---|
| 类型 | 非过程性语言 | 过程性语言 |
| 操作对象 | 面向集合 | 面向单个数据 |
| 主要用途 | 访问数据库 | 处理数据 |
✅ SQL 是非过程性关系数据库语言:用户只需说明"要什么",系统负责"如何获取"。
3.2 SQL(Structured Query Language)语言概况(重点)
SQL 按功能分为 4 大部分:
- 数据定义语言(DDL):定义、撤消、修改数据模式(表、视图、索引等);
- 查询语言(QL):查询数据;
- 数据操纵语言(DML):增、删、改数据;
- 数据控制语言(DCL):控制数据访问权限。
3.3 SQL 数据定义语言(DDL)(重点)
基表与视图
- 基表 (base table):数据显式存储在数据库中;
- 视图 (view):虚表 ,仅有逻辑定义,不显式存储 ,由其他表/视图导出;
- 可像基表一样参与数据库操作。
数据类型
- 一般 SQL 支持的数据类型见 PDF 表 3-1(未列出具体类型,但强调"见表 3-1")。
3.3.2 基表模式的定义(CREATE TABLE)
- 基本语法结构 (图 3-1):
- 关键字(椭圆)、非终极符(方框)、终极符(圆圈);
- 完整性约束子句 :
NOT NULL:列不得为空;PRIMARY KEY(...):定义主键;DEFAULT value:缺省值;FOREIGN KEY(...) REFERENCES 表名 ON DELETE {RESTRICT \| CASCADE \| SET NULL};- ON DELETE 选项 (重点):
CASCADE:主表删除某主键 → 基表中引用该主键的行也被删除;RESTRICT(默认 ):被基表引用的主键不得删除;SET NULL:主表删除主键 → 基表中外键值设为 NULL(要求该列无NOT NULL约束)。
- ON DELETE 选项 (重点):
📌 例 3-1:定义 STUDENT、COURSE、SC 三表,含主键、外键、DEFAULT、ON DELETE 等完整语法。
3.3.3 基表模式的修改(ALTER TABLE)(重点)
SQL 提供 7 种修改命令:
-
增加列 :
sqlALTER TABLE [创建者名.]表名 ADD 列名 类型;注:SQL 未提供删除列的命令(需重建表实现)。
-
删除基表 :
sqlDROP TABLE 表名; -
补充定义主键 :
sqlALTER TABLE 表名 ADD PRIMARY KEY (列名表); -
撤消主键定义 (提升插入效率):
sqlALTER TABLE 表名 DROP PRIMARY KEY; -
补充定义外键 :
sqlALTER TABLE 表名-1 ADD FOREIGN KEY [外键名] (列名表) REFERENCES 表名-2 [ON DELETE {RESTRICT \| CASCADE \| SET NULL}]; -
撤消外键定义 (提升性能):
sqlALTER TABLE 表名 DROP 外键名; -
定义和撤消别名 (SYNONYM):
sqlCREATE SYNONYM 标识符 FOR 创建者名.表名/视图名; DROP SYNONYM 标识符;
3.3.4 索引的建立和撤消(CREATE/DROP INDEX)
-
语法 (图 3-2):
sqlCREATE [UNIQUE] INDEX 索引名 ON 表名 (列名 [ASC/DESC], ...); DROP INDEX 索引名; -
UNIQUE:索引属性值唯一(用于主键/候选键); -
ASC(升序,默认)、DESC(降序)。
📌 示例:
sqlCREATE INDEX H_INDEX ON STUDENT(HEIGHT); CREATE UNIQUE INDEX SC_INDEX ON SC(SNO DESC, CNO ASC);
3.4 SQL 查询语言(QL)(重点)
3.4.1 基本 SQL 查询语句(SELECT)
-
语法结构 (图 3-3):
sqlSELECT [DISTINCT] 查询项 FROM 表/视图名 [WHERE 条件] [GROUP BY 列名] [ORDER BY 列名 [ASC/DESC]]; -
各子句作用 :
SELECT:必需,指定查询列或表达式;FROM:必需,指定查询表/视图;WHERE:任选,筛选条件;GROUP BY:任选,分组;ORDER BY:任选,排序。
3.4.2 复杂查询写法(多表查询)(重点)
-
三种等价写法 (以"选修 CS-221 的学生"为例):
-
连接查询 (笛卡尔积 + 条件):
sqlSELECT STUDENT.SNO, SNAME FROM STUDENT, SC WHERE STUDENT.SNO = SC.SNO AND CNO = 'CS-221'; -
嵌套查询 (IN 子查询):
sqlSELECT SNO, SNAME FROM STUDENT WHERE SNO IN (SELECT SNO FROM SC WHERE CNO = 'CS-221'); -
存在量词嵌套查询 (EXISTS):
sqlSELECT SNO, SNAME FROM STUDENT WHERE EXISTS (SELECT * FROM SC WHERE SC.SNO = STUDENT.SNO AND CNO = 'CS-221');
-
-
PDF 观点 :嵌套查询"层次分明,具有结构程序设计特点,执行效率高于连接查询的笛卡尔积"。
3.4.3 GROUP BY 和 ORDER BY 子句(重点)
GROUP BY:按列值分组;多列时逐层分组;HAVING:筛选基本组 (分组后的结果); ✅SELECT中的非聚合项,在基本组中必须唯一;ORDER BY:排序;多列时逐层排序 ;ASC默认。
📌 例 3-10:查询计算机系课程的最高、最低、平均成绩(排除成绩不全的课程),按 CNO 升序排列:
sqlSELECT CNO, MAX(GRADE), MIN(GRADE), AVG(GRADE) FROM SC WHERE CNO LIKE 'CS%' GROUP BY CNO HAVING CNO NOT IN (SELECT CNO FROM SC WHERE GRADE IS NULL) ORDER BY CNO;
3.4.4 包含 UNION 的查询
- 集合运算 :
UNION(并)、INTERSECTION(交)、MINUS(差); - 要求 :参与运算的关系必须目数相等 ,对应属性域相同;
UNION自动消除重复元组。
📌 例 3-11:
sqlSELECT SNO FROM STUDENT WHERE YEAR(BDATE) = 1973 UNION SELECT SNO FROM SC WHERE CNO LIKE 'EE%';
3.5 SQL 数据操纵语言(DML)
3.5.1 INSERT 语句
-
插入单个元组 :
sqlINSERT INTO 表名 VALUES (值1, 值2, ...); -
插入部分字段 (其余为 DEFAULT/NULL):
sqlINSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); -
从查询结果插入 (批量插入):
sqlINSERT INTO 表名 SELECT ... FROM ...;
3.5.2 DELETE 语句
-
删除满足条件的元组 :
sqlDELETE FROM 表名 WHERE 条件; -
无 WHERE 子句 → 删除所有元组(表变空,非 DROP)。
3.5.3 UPDATE 语句
-
更新满足条件的元组 :
sqlUPDATE 表名 SET 列 = 表达式 WHERE 条件; -
无 WHERE 子句 → 更新所有元组。
3.6 SQL 中的视图
3.6.1 普通视图
-
定义 :
sqlCREATE VIEW 视图名 [(列名)] AS SELECT 语句;✅ 视图不能使用
UNION、ORDER BY等(PDF 明确指出)。 -
撤消 :
sqlDROP VIEW 视图名; -
特点 (重点):
- 动态性 :视图内容随基表更新而实时变化;
- 更新限制 (PDF 明确列出):
- 由单表 定义的视图,只有含主键/候选键且无表达式/函数,才允许更新;
- 多表连接 定义的视图不允许更新;
- 含
GROUP BY或聚集函数 的视图不允许更新。
-
视图优点 (重点):
- 逻辑数据独立性:模式变化时,只需改视图,应用不变;
- 简化用户观点:用户只关心视图,不需处理多表连接;
- 数据安全保护 :通过视图限制用户可见数据。
3.6.2 临时视图和递归查询(重点)
-
临时视图 :
- 用
WITH定义(非CREATE VIEW); - 仅用于紧随其后的查询语句;
- 查询结束后自动消失 ,无需 DROP。
- 用
-
递归查询 (PDF 以路径查询为例):
sqlWITH RECURSIVE PATH(x, y) AS ( (SELECT * FROM ARC) -- 基础情况 UNION (SELECT PATH.x, ARC.y FROM PATH, ARC WHERE PATH.y = ARC.x) -- 递归情况 ) SELECT * FROM PATH;✅
PATH在定义中递归引用自身 ;✅ 可加限制(如
WHERE x = 'A')缩小初始集,提升效率。
重点内容总结
- 核心重点 :
- SQL 四大功能划分(DDL/Q/DML/DCL)
- CREATE TABLE 完整语法(主键、外键、ON DELETE 选项)
- ALTER TABLE 的 7 种命令(尤其增列、改主外键)
- 三种多表查询写法(连接、IN 嵌套、EXISTS)
- GROUP BY + HAVING 的使用规则
- 视图的定义、特性、更新限制与优点
- 临时视图与递归查询语法(WITH RECURSIVE)
- 次重点 :
- 索引的创建(UNIQUE、ASC/DESC)
- INSERT/UPDATE/DELETE 语句
- UNION 查询的约束
第4章 Introduction to DBMS
4.1 DBMS 的结构(重点)
- DBMS 是数据库系统的核心,对数据库系统的功能和性能具有决定性影响。
- DBMS 的基本功能 :正确、安全、可靠地执行数据库语言语句。
- DBMS 有两种实现方法 (类比高级语言):
- 编译方式
- 解释方式
- 图 4-1(DBMS 结构图) 说明了关系型 DBMS 的执行流程,可据此理解 DBMS 的一般工作原理和主要组成部件。
4.2 事务(Transaction)(重点)
事务定义
- 事务是 DBMS 的执行单元 ,由有限个数据库操作序列组成。
事务的 ACID 特性(重点)
- Atomicity(原子性)
- "不做任何事,或做所有事"(Do nothing or do all)。
- Consistency(一致性)
- 事务应使数据库从一个一致状态 转变到另一个一致状态。
- Isolation(隔离性)
- 多个事务并发执行时,应如同每个事务独立执行;
- 由 "并发控制" 机制保证。
- Durability(持久性)
- 成功执行的事务对数据库的影响应是持久的;
- 即使数据库因故障损坏,也应可恢复。
✅ 上述四项合称 事务的 ACID 准则。
事务出口(重点)
- COMMIT :提交事务,相当于"do all";
- 只有在 COMMIT 之后,事务对数据库的改变才对其它事务开放;
- 执行 COMMIT 时,要封闭中断,以防处理中断时发生故障。
- ROLLBACK:回滚事务,撤销影响,相当于"do nothing"。
事务示例:账户转账
text
BEGIN TRAN
read A
A ← A -- S
if A < 0 then
display "A款不足"
ROLLBACK ← 出口1
else
B ← B + S
display "拨款完成"
COMMIT ← 出口2
4.3 DBMS 的进程结构(重点)
设计目标
- 合理结构
- 性能提升
两种主流结构方案
(1)一个应用进程对应一个 DBMS 核心进程
- 优点:易于实现。
- 缺点 :
- 进程创建、撤销、通信、切换开销大;
- 并发事务增加 → 进程数剧增 → 内存受限 → 性能下降;
- 不利于事务共享内存空间。
(2)单进程多线程结构(重点)
- 线程 :现代操作系统引入的概念,是程序并发执行的单位 ;
- 一个进程可创建多个线程;
- 同一进程的线程共享进程资源;
- 线程所需资源少于进程;
- 线程切换和通信开销小。
- DBMS 实现 :
- 系统只创建一个 DBMS 进程;
- 进程内包含:
- 常驻的公共服务线程
- 按用户请求创建的用户线程
- 优势 :
- 并发从进程级 提升到线程级;
- 大幅提升数据库并发能力。
DBMS 自主线程管理的原因(重点)
- 可按 DBMS 需要确定线程调度策略;
- 线程在用户态切换 ,无需进入操作系统核心态,切换开销小;
- 可在不支持线程的操作系统 上运行,提高可移植性。
操作系统需提供的支持
- 非阻塞 I/O 和异步 I/O;
- 公平调度 :
- 多线程 DBMS 进程不应被当作普通进程对待,应被区别调度。
4.4 DBMS 的系统结构
(1)分时环境下的集中式数据库系统结构
- 数据库建在本单位主计算机上;
- 用户通过终端分时访问;
- 所有功能(从接口到核心)集中在 DBMS 所在计算机;
- 数据及其管理完全集中。
(2)网络环境下的客户/服务器(C/S)结构
- 客户端 :面向用户,接受任务,将需服务器完成的部分委托给服务器;
- 服务器端:运行 DBMS 核心部分;
- 特点 :处理分布,数据集中;
- 客户端可有自己的局部 DBMS。
(3)物理分布、逻辑集中的分布式数据库
- 背景 :企业规模扩大、地理分散,集中式系统暴露问题:
- 通信开销高
- 效率低
- 可扩展性差
- 管理困难
- 特点 :
- 数据物理上分布于各部门计算机;
- 全局统一数据模式 ,实现所有节点对所有数据的约定访问;
- 用户看到的是逻辑上集中的数据库;
- "数据就近存取" 是核心思想。
- 缺点 :全局数据模式难设计、管理、扩充和修改(类比"高度集中的计划经济")。
(4)物理分布、逻辑分布的分布式数据库(联邦式)
- 特点 :
- 节点自治(Node autonomy);
- 无需全局数据模式。
- 每个节点包含两类数据模型 :
- 本节点的局部数据模型;
- 本节点共享的其他节点的数据模型。
- 优点 :
- 节点模式修改、节点加入/撤离,仅影响相关节点;
- 灵活性、可扩展性强。
- 又称为 :联邦式数据库系统(Federated Distributed Database System)。
4.5 数据目录(Data Catalog)(重点)
基本概念
- 数据目录 :存储描述数据模式的数据;
- 也称为 元数据(Meta-data);
- 用于长期管理大量共享、持久的数据。
组成
- 通常由若干系统表 组成,例如:
SYSTAB(系统表)SYSCOL(系统列)SYSIDX(系统索引)SYSVIEW(系统视图)SYSVWATR(视图属性)
特点
- 既是数据,又不同于一般数据;
- 在关系数据库中,以表的形式存在,可被查询;
- 主要服务于 DBMS 自身;
- 只能由系统定义和拥有;
- 系统初始化时自动生成(类比编译器的符号表,具有递归初始特性)。
元数据分类
- 相对稳定的数据 :
- 基表、视图、索引的定义;
- 频繁变化的数据 :
- 数据库状态统计信息(如元组数、不同属性值个数等);
- 主要用于查询优化;
- 可定期更新,不要求绝对准确。
重要性
- 数据目录是影响系统全局的、以读为主的数据;
- 对系统效率影响很大。
重点内容总结
- 核心重点 :
- 事务的 ACID 特性 及 COMMIT/ROLLBACK 语义
- DBMS 单进程多线程结构 及其优势
- 数据目录(元数据)的组成与作用
- 次重点 :
- DBMS 的两种实现方式(编译/解释)
- C/S 与分布式数据库结构(集中式 vs 联邦式)
- 操作系统对 DBMS 线程的支持要求
第5章 数据库的存储结构(Storage Structure of Database)
5.1 数据库存储介质的特点(重点)
- 多级存储器结构 :数据库主要使用辅存 (secondary storage),其中磁盘是最常用的辅存。
- 光盘 因速度慢、价格高 ,近期无法取代硬盘。
- 磁带 是顺序存取存储器 ,通常用作后备存储器(backup memory)。
- 内存不适合作为主要数据库存储介质。
- 活动头磁盘的存取时间 由三部分组成:
- 寻道时间(seeking time)
- 等待时间(waiting time,即旋转延迟)
- 传输时间(transmission time)
- 磁盘与内存间的数据交换以物理块为单位 。
- 优点:
- 减少 I/O 次数 → 降低寻道和等待时间
- 减少存储间隙 → 提高磁盘空间利用率
- 块大小由操作系统决定。
- 优点:
- **缓冲区(buffer)**用于解决磁盘与内存速度不匹配问题。
- 支持重叠操作:一边读写磁盘,一边处理数据。
- 多个缓冲块可供申请使用。
- 操作系统和 DBMS 各自设置缓冲机制。
- DBMS 采用延迟写 (delayed writing):
- 提前读:预读可能用到的块
- 延迟写:暂缓写回,合并写操作
✅ 重点:物理块是 I/O 单位;缓冲与提前读/延迟写是提升 I/O 性能的关键手段。
5.2 记录的存储结构(重点)
5.2.1 记录的内部表示方式(三种方法)
- 定位法 (Positioning Method)
- 每个字段分配固定长度(按最大可能长度)
- 示例:
LIbbb(5字符,不足补空格)
- 相对法 (Relative Method)
- 字段间用特殊分隔符 (如
?,#)隔开 - 问题:若字段内容含分隔符,需转义处理
- 字段间用特殊分隔符 (如
- 计数法 (Counting Method)
- 每个字段前加长度计数 (如
02LI04MING...) - 要求:字段实际长度 ≤ 计数位能表示的最大值
- 每个字段前加长度计数 (如
5.2.2 记录在物理块上的分配方式
-
记录类型:固定长度 / 可变长度
-
两种分配策略:
- 记录跨块存储 (Spanned block storage)
- 允许一个记录跨越多个物理块
- 优点:充分利用碎片空间
- 缺点:寻址复杂
- 记录不跨块存储 (Unspanned)
- 每个记录必须完整存于一个块内
- 可能造成块内空间浪费
- 记录跨块存储 (Spanned block storage)
-
块因子 (blocking factor)
p = [B / R]B:物理块有效大小R:固定长度记录大小p:每块可存放记录数
✅ 重点:跨块存储节省空间但增加寻址复杂度;块因子影响 I/O 效率。
5.3 文件结构与存取路径(重点)
5.3.1 文件访问的五类需求
- 查询文件中全部或大量记录(≥15%)
- 查询特定记录
- 查询部分记录
- 范围查询(Range query)
- 更新记录
5.3.2 数据库对文件管理的要求(重点)
传统 OS 文件系统不适用于 DBMS,原因:
- 无法提供 DBMS 所需的附加元数据(如索引、统计信息)
- 面向批处理 ,而 DBMS 要求即时访问与动态修改
- 共享度低,用途单一
- 数据量变化大,而传统文件数据量相对稳定
- 减少对 OS 依赖可提高 DBMS 可移植性
✅ 结论 :多数 DBMS 独立设计存储结构,不依赖 OS 文件系统。
5.3.3 数据库中的基本文件类型(重点)
-
堆文件(Heap File)
- 记录按插入顺序存储
- 唯一存取路径:顺序扫描
- 插入高效,查询低效(平均访问 (N+1)/2 条记录)
- 删除记录 :可加删除标记,定期集中整理
- 若排序后可用二分查找,但排序代价高
-
直接文件(Direct File / Hash File)
- 使用散列函数
H(key) → address - 散列键(hash key)决定记录地址
- 问题 :
- 地址重叠(冲突)需额外处理
- 仅对散列键查询高效
- 不适合可变长记录
- 难以设计通用散列函数
- 应用受限,在 DBMS 中不广泛使用
- 使用散列函数
-
索引文件(Indexed File)(重点)
-
索引 :将键值 → 存储地址的映射机构
-
与散列区别:索引仅在有记录时占用空间,散列即使空也占满地址空间
-
索引类型:
- 主索引 (Main Index):以主键为索引键
- 次索引 (Secondary Index):以非主键为索引键
- 倒排文件 (Inverted File):所有属性都建索引(搜索引擎典型应用)
-
稠密索引(Dense Index)
- 每个键值对应一个索引项
- 可用于预查找(用地址代替记录参与集合运算,减少 I/O)
- 问题 :索引可能溢出;若键值不唯一且记录分散,I/O 开销大
-
非稠密索引(Non-dense Index)
- 不为每个键值建索引项(通常只在主键上建立)
- 要求:文件按索引键排序
- 每个索引项对应一个"单元存储区"(多个记录)
- 溢出区处理插入导致的溢出
- 可建多级索引 ,最高级尽量常驻内存
-
簇集索引(Clustering Index)
- 物理上将相同键值的记录集中存放
- 优点:减少 I/O(一个键值对应多记录时只需读少量块)
- 缺点:建立开销大,需重组织整个文件
-
非簇集索引(Non-clustering Index)
- 记录不按索引键排序,相同键值记录可能分散
- 查询效率低于簇集索引
-
✅ 重点对比:
- 主索引 → 非稠密(因主键唯一且文件按主键排序)
- 次索引 → 稠密
- 簇集索引 → 按索引键排序 + 集中存储 → 高效
- 非簇集索引 → 无排序 → 效率低
5.4 动态索引(重点)
- 静态索引:多分支树(如 ISAM)
- 动态索引 :平衡多分支树 ,如 B-树、B⁺-树
B⁺-树的约束条件
- 每个节点最多有
2k个键值(k为秩,order) - 根节点至少 1 个键值,其他节点至少
k个 - 节点内键值有序存放
- 若节点有
J个键值,则有J+1个子女(除叶节点) - 所有叶节点在同一层 → 树始终保持平衡
B⁺-树的插入与删除
- 插入 :
- 若叶节点已满(
2k个键值),分裂为两个节点 - 分裂可能向上传播,直至根节点(根分裂则树高 +1)
- 若叶节点已满(
- 删除 :
- 若删除后键值数
< k,尝试向兄弟借键值 - 若兄弟也无法借,则合并节点,可能向上传播
- 若删除后键值数
B⁺-树的结构(两类节点)
- 索引集节点 (内部节点)
- 格式:
P₀ K₀ P₁ K₁ ... Kₙ₋₁ Pₙ
- 格式:
- 顺序集节点 (叶节点)
- 格式:
前向指针 后向指针 K₀ tid₀ K₁ tid₁ ... Kₙ tidₙ tid(tuple identifier) = 块号 + 块内记录指针
- 格式:
B⁺-树的搜索策略
- 从根开始,按以下规则向下搜索:
- 若
Kx < K₀→ 沿P₀ - 若
Kx > Kₙ₋₁→ 沿Pₙ - 若
Kᵢ₋₁ < Kx ≤ Kᵢ→ 沿Pᵢ
- 若
索引集与顺序集的关系
- 顺序集节点中的键值范围受其父索引节点键值约束
- 例如:若父节点指向
Pᵢ,则顺序集键值满足Kᵢ₋₁ < K ≤ Kᵢ
- 例如:若父节点指向
B⁺-树的性能分析(重点)
-
搜索 I/O 次数 = 树的高度 L
-
设不同键值数为
N,秩为k,则:N ≥ 2(k+1)^(L-2) × k ⇒ L ≤ 2 + log_{k+1}(N / 2k) ≈ 1 + log_{k+1}(N/2) -
示例 :
k=99,N=2,000,000→L < 5→ 最多 4 次 I/O 找到叶节点
B⁺-树提供的三种存取路径(重点)
- 通过索引集进行树形搜索(点查询)
- 通过顺序集进行顺序搜索(范围查询)
- 先通过索引找到入口,再沿顺序集顺序搜索(范围查询优化)
其他要点
- B⁺-树实现的索引均为稠密索引
- 主索引可用 B⁺-树实现 ;次索引只需将叶节点
tid改为指针列表(因键值可能对应多记录)
重点内容总结
- 核心重点 :
- 物理块是 I/O 基本单位,缓冲与提前读/延迟写提升性能
- 堆文件、直接文件、索引文件的特点与适用场景
- 稠密 vs 非稠密索引 、簇集 vs 非簇集索引的区别
- B⁺-树的结构、插入/删除算法、搜索路径、I/O 性能分析
- B⁺-树提供的三种存取路径
- 次重点 :
- 记录的三种内部表示方法(定位/相对/计数)
- 跨块存储的优缺点
- DBMS 为何不依赖 OS 文件系统
第6章 查询处理与优化(Query Process and Optimization)
6.1 引言(Introduction)
- 查询处理 (Query Process):
DBMS 对描述性语言表达的查询语句进行分析,为其确定合理、有效的执行策略和步骤的过程。 - 查询优化 (Query Optimization):
是查询处理中的重要一环,对关系数据库尤其重要。 - 优化是相对的 :
可能的执行策略很多,穷尽代价很大,不能片面追求绝对最优。 - 两种执行方式 :
- 解释方式 (Interpretation execution)
- 优化占执行时间;
- 适用于简短的即时查询,灵活实用。
- 编译方式 (Compile mode execution)
- 优化不占执行时间;
- 适用于频繁执行的 SQL 事务,可提高性能。
- 解释方式 (Interpretation execution)
6.2 代数优化(Algebraic Optimization)(重点)
- 目标 :对查询进行等效变换 ,以减少执行开销。
- 核心原则 :尽量减小查询过程中间结果的大小 。
- 选择(σ)、投影(Π)操作通常能有效减小关系大小;
- 连接、笛卡尔积、并操作易生成较大中间结果。
常用等价变换规则(重点)
- 选择串接律 :
σ~c1 ∧ c2 ∧ ... ∧ cn~® ≡ σc1(σc2(...σcn®...)) - 选择交换律 :
σc1(σc2®) ≡ σc2(σc1®) - 投影串接律 :
Πlist1(Πlist2(...Πlistn®...)) ≡ Πlist1®,其中 list1 ⊆ list2 ⊆ ... ⊆ listn - 选择与投影交换律 :
若属性集 {A1,...,An} ⊆ Attr©,则
ΠA1,...,An(σC®) ≡ σC(ΠA1,...,An®) - 连接交换律 :
R ⋈ S ≡ S ⋈ R - 选择对连接的分配律 :
若 Attr© ⊆ Attr®,则
σC(R ⋈ S) ≡ σC® ⋈ S - 合取条件拆分 :
若 Attr(c1) ⊆ Attr®,Attr(c2) ⊆ Attr(S),则
σ~c1 ∧ c2~(R ⋈ S) ≡ σc1® ⋈ σc2(S) - 投影对连接的分配律(略,原文公式复杂)
- 选择对集合运算的分配律(∩, ∪, −)
- 投影对集合运算的分配律
- 连接与笛卡尔积的转换 :
(R ⋈c1 S) ⋈c2 T ≡ R ⋈~c1 ∧ c2~ (S × T),当 S 与 T 无连接条件时
代数优化基本步骤(重点)
- 生成原始查询树 :
- SELECT → 投影
- FROM → 笛卡尔积
- WHERE → 选择
- 选择操作下推 :
应用规则 2、6、7、9、10,将选择尽可能移向树叶。 - 调整连接顺序 :
按小关系优先原则,重新安排连接顺序。 - 合并选择与笛卡尔积为连接操作。
- 消除无用属性 :
对每个叶节点加必要投影,去除对查询无用的属性。
嵌套查询的优化
- 与上层无关的嵌套查询:从最内层开始,逐层计算。
- 与上层相关的嵌套查询 :一般用代入法 。
- 将上层查询涉及表的每条记录代入内层,R1.A1 视为常量。
- 注意 :尽可能做"部分选择",减少代入的元组数。
6.3 依赖于存取路径的规则优化(重点)
代数优化不涉及存取路径,优化效果有限。合理选择存取路径能显著提升性能。
6.3.1 选择操作的实现和优化
- 选择条件类型:等值、范围、集合(IN/EXISTS)、复合(AND/OR)
- 存取路径选择的启发式规则 (重点):
- 小关系 → 顺序扫描;
- 无索引 / 选取比例 > 20% / 无簇集索引 → 顺序扫描;
- 主键等值选择 → 优先用主键索引或散列;
- 非主键等值选择 :
- 选取比例 < 20% → 用无序索引;
- 否则 → 用簇集索引或顺序扫描;
- 范围条件 :
- 用索引找边界,再沿顺序集搜索;
- 若比例大 → 用簇集索引或顺序扫描;
- AND 条件 :
- 优先用多属性索引;
- 或用多个次索引做预查找;
- 或逐个条件筛选;
- OR 条件(重点) :
- 无好方法,只能分别选出元组集,再求并;
- 只要一个条件无合适存取路径,就必须顺序扫描。
6.3.2 连接操作的实现和优化(重点)
-
实现方法:
- 嵌套循环法 (Nested Loop)
- 外关系 R,内关系 S;
- I/O 次数:bR + [bR/(nB−1)] × bS;
- 应将物理块数少的关系作外关系。
- 利用索引/散列法
- 内关系需有连接属性上的索引;
- 簇集索引效果最明显;
- 若匹配元组比例 > 15%,索引可能不如顺序扫描。
- 排序归并法 (Sort-Merge)
- 两关系均已按连接属性排序时优先使用;
- 等值匹配时效率高。
- 散列连接法 (Hash Join)
- 用相同散列函数将 R、S 散列到同一文件;
- 注意:h(A)=h(B) 不一定 ⇒ A=B,仍需按 A=B 检查。
- 嵌套循环法 (Nested Loop)
-
连接方法选择的启发式规则(重点):
- 两关系均已排序 → 优先用排序归并;
- 一个关系在连接属性上有索引/散列 → 用索引法;
- 无上述条件且关系较小 → 用嵌套循环;
- 其他情况 → 用散列连接。
6.3.3 投影操作的实现
- 通常与选择、连接同时进行,无附加 I/O;
- 若投影属性不含主键 → 可能有重复元组;
- 去重方法:排序法、散列法。
6.3.4 集合操作
- 并、交、差 :
- 可用排序法(按主键排序后扫描);
- 或散列法(散列到同一文件,检查重复)。
- 笛卡尔积 :
- 用嵌套循环实现;
- 结果大、耗时高,应尽量少用。
6.3.5 组合操作
- 多个操作可组合执行 ,如:
- 扫描外关系时同步执行其选择、投影,并存入临时文件;
- 生成连接结果时同步执行最终投影。
6.5 结束语(优化策略分类)
- 静态优化 :
- 执行前优化;
- 仅利用统计数据,不一定准确。
- 动态优化 :
- 执行时优化;
- 用实际执行结果估算代价,更符合实际;
- 但增加执行时间 ,不利于并行性。
重点内容总结
- 核心重点 :
- 代数优化的5个基本步骤(选择下推、小关系优先、消除无用属性)
- OR 条件导致必须顺序扫描
- 连接操作的4种实现方法及选择规则
- 选择操作的7条存取路径启发式规则
- 嵌套查询的代入法与部分选择优化
- 次重点 :
- 解释方式 vs 编译方式的适用场景
- 投影去重的排序/散列法
- 集合操作的实现
- 静态 vs 动态优化的优劣
第7章 事务管理(Transaction Management)
- 事务管理包含两大技术 :
- 恢复(Recovery):保证事务在数据库发生故障后满足 ACID 准则;
- 并发控制(Concurrency Control):保证事务在并发执行时满足 ACID 准则。
7.1 恢复引论(Recovery Introduction)
故障处理的两种措施
- 尽可能提高系统可靠性;
- 恢复(Recovery):发生故障后,将数据库恢复至一致状态。
恢复技术的三种类型
- 单纯以后备副本为基础的恢复技术
- 周期性将数据库转储(dump)到磁带(脱机存储);
- 增量转储(ID):仅转储变化部分;
- 优点:实现简单,不增加运行开销;
- 缺点 :不能恢复到最近一致状态;
- 适用:小型、非关键系统。
- 以后备副本和运行记录为基础的恢复 (重点)
- 运行记录 (log/journal)包含:
- 前像 (Before Image, BI):更新前的物理块映像 → 用于 undo;
- 后像 (After Image, AI):更新后的物理块映像 → 用于 redo;
- 事务状态:记录事务是否 COMMIT。
- 恢复过程 :
- 取最近后备副本;
- 对未提交事务 ,用 BI undo(向后恢复);
- 对已提交事务 ,用 AI redo(向前恢复);
- 优点 :可恢复到最近一致状态;
- 缺点:需维护 log,影响正常运行速度;
- 适用 :大多数商品化 DBMS。
- 运行记录 (log/journal)包含:
- 基于多副本的恢复技术
- 利用多个 DB 副本互为备份;
- 镜像磁盘(Mirrored Disks):两个磁盘同时写入,一盘失效可用另一盘恢复;
- 适用:分布式数据库、高可靠性系统。
7.2 运行记录的结构(Log Structure)(重点)
- log 不能与数据库放在同一磁盘,以防"全军覆没"。
- log 基本内容 :
- 活动事务表 (ATL):记录所有未提交事务的 TID;
- 提交事务表 (CTL):记录所有已提交 事务的 TID;
- 提交顺序:先写 CTL,再从 ATL 删除 TID;
- 前像文件:堆文件结构,每个块有 BID(TID + 关系名 + 逻辑块号);
- 后像文件:结构同前像文件,存 AI。
- undo 和 redo 满足幂等性 :
undo(undo(x)) = undo(x)redo(redo(x)) = redo(x)
- 减小 log 规模的方法 :
- 不保留已提交事务的前像;
- 有选择地保留后像;
- 合并同一逻辑块的多次后像,只保留最新。
7.3 更新事务的执行与恢复(重点)
两条基本规则
- 提交规则 (Commit Rule):
- 后像必须在事务提交前写入非易失存储器(DB 或 log)。
- 先记后写规则 (Log Ahead Rule):
- 若后像写入 DB,前像必须先写入 log。
三种更新策略
| 策略 | 后像写入时机 | 恢复操作 |
|---|---|---|
| (a) 提交前写 DB | 提交前完全写入 DB | 未提交 → undo;已提交 → 无操作 |
| (b) 提交后写 DB | 提交后写入 DB | 未提交 → 无操作;已提交 → redo |
| © 提交前后写 DB | 部分在提交前,部分在提交后 | 未提交 → undo ;已提交 → redo |
✅ 策略 © 优点:均衡磁盘 I/O 负载。
7.5 消息的处理(Message Handling)
- 事务可能需发送影响性消息(如"付款2000元");
- 消息应遵循 "do nothing or do all" 原则;
- 实现机制 :
- 事务将消息交给消息管理子系统(MM);
- MM 为每个事务建消息队列;
- 事务正常结束(提交/回卷)后,MM 才发送消息;
- 事务被撤销,MM 丢弃消息;
- 消息发送采用 "发送-确认"(MSG-ACK)机制。
7.6 失效的类型及恢复对策(重点)
1. 事务失效(Transaction Failure)
- 原因:逻辑错误(如除零、数据类型错);
- 特点 :发生在提交前,DB 未破坏;
- 恢复措施 :
- MM 丢弃消息队列;
- 执行 undo;
- 从 ATL 删除 TID,释放资源。
2. 系统失效(System Failure)
- 原因:掉电、OS/DBMS 崩溃;
- 恢复措施 :
- 重启系统;
- undo 未提交事务,redo 已提交事务;
- 问题:CTL 可能很长,redo 开销大。
- 优化:检查点 (Checkpoint, CP)
- 定期强制写入CP 以来所有已提交事务的后像;
- 恢复时,CP 之前的事务无需 redo;
- 取 CP 过程:
- 暂停事务;
- 写入后像;
- 在 log 的 CTL 中记录 CP;
- 恢复事务。
- CTL 清空时机 :取后备副本后。
3. 介质失效(Media Failure)
- 原因:磁盘物理损坏;
- 恢复措施 :
- 修复/更换磁盘;
- 重启系统(如需要);
- 加载最近后备副本;
- redo 后备副本之后所有已提交事务(包括 CP 之前)。
7.7 并发控制(Concurrency Control)
7.7.1 并发方式
- 串行访问:事务顺序执行;
- 并发访问 :
- 交叉并发(单 CPU)
- 同时并发(多 CPU)
7.7.2 并发目的
- 提高系统资源利用率;
- 改善短事务响应时间。
7.7.3 并发引起的问题(重点)
- 丢失更新 (Lost Update)
- 两事务并发写同一数据 → 写-写冲突;
- 读脏数据 (Dirty Read)
- 读取未提交事务的中间结果 → 读-写冲突;
- 不可复现读 (Unrepeatable Read)
- 同一事务两次读同一数据,值不同 → 由并发写引起。
7.7.4 并发控制的正确性准则(重点)
- 调度(Schedule):对并发事务所有操作的顺序安排;
- 冲突操作 :
- Ri(x) 与 Wj(x)
- Wi(x) 与 Wj(x) (i≠j)
- 冲突等价 :通过交换不冲突操作得到的调度;
- 可串行化 (Serializable):
- 若调度 S 与某串行调度等价,则 S 是可串行化的;
- DBMS 以可串行化为并发控制的正确性准则。
- 前趋图法判断可串行化 :
- 顶点:事务;
- 边:冲突操作顺序(Ti → Tj);
- 无环 → 可串行化;有环 → 不可串行化;
- 拓扑排序得等价串行序列。
7.8 加锁协议(Lock Protocol)(重点)
基本概念
- 排他锁(X Lock):读/写均需 X 锁;
- 两阶段锁协议 (2PL):
- 增长阶段:只加锁;
- 收缩阶段:只解锁;
- 定理 :所有事务满足 well-formed (先加锁后操作) + 2PL → 调度可串行化。
(S, X) 锁
- S 锁(共享锁):用于读;
- X 锁(排他锁):用于写;
- 相容矩阵 :
- S 与 S 相容;
- X 与任何锁不相容。
(S, U, X) 锁(重点)
- U 锁 (更新锁):
- 事务先加 U 锁 ,写时再升级为 X 锁;
- 目的:减少排他时间,提高并发度,减少死锁;
- U 锁互斥 :
- 已加 U 锁,不允许其他事务再加 U 锁;
- 原因:若允许多个 U 锁,升级 X 时会因互斥而死锁。
7.9 死锁的检测、处理与防止(重点)
死锁 vs 活锁
- 死锁:循环等待;
- 活锁:事务无限等待(如总被更高优先级抢占)。
死锁检测
- 超时法:等待超时即判死锁;
- 等待图法 :
- 顶点:事务;
- 边:Ti 等待 Tj;
- 有环 → 死锁。
死锁处理
- 选牺牲者(最年轻、undo 代价最小);
- 终止牺牲者,释放所有锁;
- 等待后重启动。
死锁防止
- 一次性申请所有锁;
- 按编号顺序加锁;
- 时间戳法 :
- Wait-die:老事务等,年轻事务"死"(重试);
- Wound-wait:老事务"击伤"(终止)年轻事务;
- 共同点 :单向等待,避免循环。
7.10 多粒度封锁(Multi-granularity Locking)
封锁粒度
- DB → File → Record → Field
- 粒度大:锁开销小,但并发度低;
- 粒度小:并发度高,但锁开销大。
意向锁(Intention Locks)(IBM 方案)
- IS(Intention Share):表示子节点将加 S 锁;
- IX(Intention Exclusive):表示子节点将加 X 锁;
- SIX(S + IX):本节点 S 锁,子节点 X 锁。
加锁规则
- 从根到叶申请锁,从叶到根释放锁;
- 可以"以强代弱"(如用 X 代替 S),但不能反向。
相容矩阵(略)
重点内容总结
- 核心重点 :
- 运行记录结构(ATL/CTL、BI/AI)
- 三种失效类型及恢复策略(尤其介质失效需 redo CP 前事务)
- 检查点(CP)的作用与 CTL 清空时机
- 并发三问题(丢失更新、脏读、不可复现)
- 可串行化调度与前趋图判断法
- (S, U, X) 锁机制及 U 锁互斥原因
- 死锁检测与防止策略(时间戳法)
- 次重点 :
- 两阶段锁协议(2PL)
- 消息处理机制
- 多粒度封锁与意向锁
好的。以下是以你提供的 《数据库原理(8).pdf》 文件内容为基础,严格按照原文结构和表述整理出的详细复习提纲 。提纲完全依据 PDF 原文内容 ,不添加外部知识或主观理解,仅提炼原文中明确定义的概念、机制、规则及示例,并标注重点内容。
第8章 数据库的安全和完整性约束
-
数据库的破坏来源:
- 系统故障
- 并发引起的数据不一致
- 人为破坏
- 数据语义错误或错误操作引起的不一致
-
本章核心内容:
- 数据库的安全保护(security protection)
- 数据完整性约束(integrity constraints)
8.1 数据库的安全保护
- 前提 :DBMS 建立在 OS 之上,OS 应保证所有对数据库的访问必须经由 DBMS ,不允许用户绕过 DBMS 直接通过 OS 访问数据。
8.1.1 视图的定义和查询修改(重点)
- 作用 :通过定义视图,限制各个用户的访问范围。
- 替代机制 :某些 DBMS 无显式视图功能,但可根据用户访问限制条件自动修改查询条件,使其只能在指定范围内查询。
8.1.2 访问控制(Access Control)(重点)
- 定义:对用户访问数据库各种资源(基表、视图、目录、实用程序等)的权限进行控制。
- 操作权限:创建、撤销、查询、增、删、改等。
- 独立性:同一 DBMS 下多个数据库的访问控制相互独立。
用户分类
- 一般数据库用户
- 具有支配部分资源权限的用户
- 具有 DBA 特权的用户
角色机制(重点)
- 问题:若多个用户权限相同,逐个授权繁琐。
- 解决方案 :定义角色(role),对角色授权。
- 规则 :
- 用户承担某角色 → 拥有该角色权限;
- 一个用户可拥有多个角色及其他权限;
- 角色不是用户,不能用于登录。
8.3 完整性约束检查
注:原文未包含 8.2 节,直接跳至 8.3。
8.3.1 完整性约束的类型(重点)
以关系数据模型为例,分为:
1. 静态约束(Static Constraints)
- (1) 固有约束 (Inherent Constraints)
- 例如:第一范式(1NF)
- (2) 隐含约束 (Implicit Constraints)
- 用 DDL 说明,例如:
- 域完整性
- 实体完整性
- 引用完整性
- 用 DDL 说明,例如:
- (3) 显式约束 (Explicit Constraints)
- 依赖于数据语义和具体应用。
2. 动态约束(Dynamic Constraints)
- 不约束数据库状态本身 ,而是约束状态转换过程(从一个状态到另一个状态需满足的条件)。
8.3.2 完整性约束的说明方法(重点)
1. 用过程说明约束
- 实现方式:由应用程序完成约束检验。
- 缺点 :
- 检验分散在各应用中;
- 增加程序员负担;
- 约束变更需修改程序。
- 优点 :容易实现,目前应用较多。
2. 用断言(Assertions)说明约束
- 机制 :
- DBMS 提供断言语言;
- 用户编写完整性断言;
- 系统编译成约束库(constraint base);
- 对每个更新事务,用相关断言检查,违反则回卷。
- 示例 :
Assert 余额约束 on 储蓄帐:余额 ≥ 0 - 优点 :
- 集中控制;
- 用户无需编程;
- 维护方便。
- 缺点 :
- 实现复杂;
- 开销大;
- 处理单一。
3. 用触发器(Triggers)表示约束(重点)
-
形式 :
whenever <条件> then <动作> -
组成:
- Event(事件):激活触发器的操作(如 INSERT/UPDATE/DELETE)
- Condition(条件):判断是否执行动作
- Actions(动作):触发后的操作(如 ROLLBACK、INSERT 等)
-
主动数据库系统:
- 传统 DBMS 是被动的(仅响应用户请求);
- 主动 DBMS 能根据事件或状态主动处理;
- 主动功能是数据库系统的一种功能,可与关系/面向对象模型结合。
触发器应用示例(重点,基于 Sailors/Boats/Reserves 三表)
关系模式:
- Sailors(sid, sname, rating, birth, master)
- Boats(bid, bname, color)
- Reserves(sid, bid, day)
引用完整性相关操作
影响引用完整性的操作包括:
- Reserves 表的 Insert / Update
- Sailors / Boats 表的 Delete / Update(仅当更新主键时)
触发器规则示例
规则1:Reserves 插入时检查外键
sql
Create trigger referential_integrity_check
Before Insert on Reserves
Referencing NEW as N
For Each Row
When (not (exists(Select * From Sailors Where sid = N.sid)
and exists(Select * From Boats Where bid = N.bid)))
Rollback;
规则2:禁止删除被引用的 Boats 记录
sql
Create trigger boats_delete
Before Delete on Boats
Referencing OLD as O
For Each Row
When (exists(Select * From Reserves Where bid = O.bid))
Rollback;
规则3:删除 Sailors 时级联删除 Reserves 记录
sql
Create trigger sailors_delete
After Delete on Sailors
Referencing OLD as O
For Each Row
When (exists(Select * From Reserves Where sid = O.sid))
Delete From Reserves Where sid = O.sid;
规则4:Reserves 更新 sid/bid 时检查外键
sql
Create trigger referential_integrity_check
Before Update of sid, bid on Reserves
Referencing NEW as N
For Each Row
When (not (exists(Select * From Sailors Where sid = N.sid)
and exists(Select * From Boats Where bid = N.bid)))
Rollback;
规则5:禁止更新被引用的 Sailors.sid
sql
Create trigger sailors_sid_update
Before Update of sid on Sailors
Referencing OLD as O
For Each Row
When (exists(Select * From Reserves Where sid = O.sid))
Rollback;
规则6:自动插入满足条件的新记录(语句级触发器)
- 需求:插入 Sailors 时,若年龄 < 19,自动插入 YoungSailors 表。
- 实现:
sql
Create trigger young_sailor_update
After Insert on Sailors
Referencing NEW TABLE as N
For Each Statement
Insert into YoungSailors(sid, sname, age, rating)
Select sid, sname, age, rating
From N
Where N.age < 19;
- 关键点 :使用
NEW TABLE和FOR EACH STATEMENT。
重点内容总结
- 核心重点 :
- 访问控制与角色机制
- 完整性约束的三类说明方法(过程/断言/触发器)
- 触发器的三要素(Event/Condition/Action)
- 引用完整性规则的触发器实现(5条核心规则)
- 语句级 vs 行级触发器的区别 (如规则6使用
FOR EACH STATEMENT)
- 次重点 :
- 视图在安全保护中的作用
- 主动数据库系统的概念
- 静态约束与动态约束的区分