【数据库原理】期末复习(初稿)

第1章 引论

1.1 数据管理的发展

  • 数据管理:对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题。
  • 数据密集型应用特点 (重点):
    1. 数据量大(TB级),通常内存无法容纳,需存于辅存;
    2. 数据为持久数据(persistent data);
    3. 数据被多个应用程序共享(如MIS、银行、办公系统、网络数据服务等)。
  • 数据管理三阶段 (重点):
    1. 人工管理
    2. 文件系统
    3. 数据库系统
  • 文件系统的缺点 (重点):
    1. 编写应用程序不方便;
    2. 数据冗余;
    3. 文件结构修改将导致应用程序修改,维护工作量大;
    4. 不支持并发访问;
    5. 数据规范化与标准化较难达到。
  • 数据库与文件系统的根本区别数据结构化 (重点)
    → 不仅描述数据本身,还描述数据之间的联系。
  • 数据库系统特征:统一管理和共享数据。

1.2 数据库系统(重点)

1.2.1 数据库系统构成
  • 组成
    • 数据库(DB)
    • 数据库管理系统(DBMS)及其开发工具
    • 应用系统
    • 数据库管理员(DBA)
    • 用户
1.2.2 DBMS主要功能(重点)
  1. 提供高级的用户接口
  2. 查询处理和优化
  3. 数据目录管理
  4. 并发控制
  5. 恢复功能
  6. 完整性约束检查
  7. 访问控制
1.2.3 硬件平台要求
  1. 足够大的内存(存放OS、DBMS核心、缓冲区、应用程序)
  2. 足够大的磁盘等直接存取设备(存放数据库和备份)
  3. 高通道能力(提高数据传送率)
1.2.4 软件组成
  1. DBMS(核心)
  2. 支持DBMS的操作系统
  3. 具有数据库接口的高级语言及其编译系统
  4. 以DBMS为核心的应用开发工具(如第四代语言、应用生成器)
  5. 特定应用环境开发的数据库应用系统
1.2.5 人员角色(重点)
  1. 数据库管理员(DBA)职责
    • 决定数据库内容与结构
    • 决定存储结构与存取策略
    • 定义安全性与完整性约束
    • 监控使用和运行
    • 定期重组织(reorganization)以提升性能
    • 根据需求变化进行重构(restructuring)
  2. 系统分析员与数据库设计人员
    • 负责需求分析、规范说明、软硬件配置、概要设计
    • 数据库设计人员负责数据确定和各级模式设计(常由DBA兼任)
  3. 应用程序员:设计、编写、调试、安装应用模块
  4. 最终用户(End User):通过接口(浏览器、菜单、表格、图形、报表)使用数据库

1.3 数据、数据模型和数据模式(重点)

1.3.1 数据与数据库
  • 数据:对事物描述的符号记录,需解释/处理才成为信息。
  • 数据库:某单位所涉数据的综合,反映数据本身及其联系。
1.3.2 数据模型(重点)
  • 定义:现实世界数据特征的抽象,是数据库系统的核心和基础。
  • 应满足三方面要求
    1. 能较真实模拟现实世界
    2. 易于人理解
    3. 便于在计算机上实现
  • 三级模型分类
    1. 概念数据模型:与DBMS无关,面向用户,语义模型(如E-R图)
    2. 逻辑数据模型:与DBMS有关,面向用户+实现
    3. 物理数据模型:与DBMS、OS、硬件有关,描述存储结构(块、指针、索引等)
1.3.3 数据模型组成要素(重点)
  1. 数据结构
    • 描述对象类型集合(静态特性)
    • 包括:
      • 与数据类型、内容、性质相关的对象(如关系模型中的域、属性、关系)
      • 与数据之间联系相关的对象(如网状模型中的系型)
    • 按数据结构类型命名模型(层次/网状/关系模型)
  2. 数据操作
    • 对对象实例允许执行的操作(动态特性)
    • 主要包括:检索、更新(插入、删除、修改)
    • 需定义操作含义、符号、规则、语言
  3. 完整性约束条件
    • 一组完整性规则集合
    • 限定数据库状态及状态变化,保证数据正确、有效、相容
1.3.4 数据模式(重点)
  • 定义:以一定数据模型对一个单位的类型、结构及其关系的描述。
  • 型 vs 值
    • 型(schema):框架
    • 值(instance):具体实例
  • 数据模型 vs 数据模式
    • 数据模型是工具(如C语言)
    • 数据模式是用该工具对具体对象的描述(如C程序)
  • 三级模式结构 (重点):
    1. 概念模式:用逻辑数据模型对单位全局数据的描述(整个数据库逻辑结构)
    2. 外模式:用逻辑数据模型对用户所用部分数据的描述(局部模式,因用户而异)
    3. 内模式:用物理数据模型对数据存储结构的描述(物理结构)
  • 数据目录:存储概念模式、外模式、内模式,DBMS通过它管理和访问模式。

1.4 数据库应用

  • 基本任务
    1. 数据库系统规划
    2. 数据库设计(需考虑:信息需求、处理需求、DBMS特性、硬件/OS特性)
    3. 数据库建立
    4. 数据库运行、管理与维护
    5. 数据库扩充与维护

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. 非根记录不能离开双亲记录而孤立存在
  2. 任何记录(包括虚拟)只允许有一个双亲
  3. 虚拟记录指针必须指向实际存在的记录,被指向记录不得删除;
  4. 虚拟记录不得为根记录
优缺点
  • 优点 :记录间联系通过指针实现,查询效率高(针对层次结构);
  • 缺点
    1. 只能表示 1:N 联系;
    2. 表示非层次关系需虚拟记录,复杂且用户不易掌握
    3. 层次顺序严格 → 查询和更新复杂,应用程序编写复杂;
    4. 模式描述语言复杂,数据独立性差

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:不自动加入。
  • 记录存在性约束 (三种留置约束):
    1. OPTIMAL(随意):属记录可脱离系存在(如"系--学生");
    2. MANDATORY(强制):属记录不能游离(如"部门--职工");
    3. 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 完整性约束(重点)
  1. 域完整性约束
    • 属性值必须在域内;
    • 是否允许为空由语义决定(如成绩 0~100)。
  2. 实体完整性约束
    • 主键不能为空唯一
  3. 引用完整性约束
    • 外键要么为 NULL ,要么等于被引用关系中某元组的主键值
  4. 一般性完整性约束
    • 用户自定义的语义约束;
    • 当前 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 提出;
  • 作为概念数据模型面向现实世界,非面向实现;
  • 用于数据库概念设计
基本概念(重点)
  1. 实体(Entity)
    • 可相互区别、被识别的事物或概念;
    • 实体集(如 Es = {e | e 是学生})。
  2. 属性(Attribute)
    • 描述实体特征;
    • 可为简单属性组合属性(如地址=省+市+区)。
  3. 实体键
    • 能唯一识别实体的属性或属性组。
  4. 联系(Relationship)
    • 实体间的关系;
    • 类型:1:1、1:N、M:N;
    • 参与度 :(min:max),如 (3:6) 表示学生选课数在 3~6 门;
      • min=0:非强制参与;
      • min>0:强制参与。
  5. 弱实体
    • 不能单独存在,依附于另一实体(如"家属"依附"职工");
    • 其主键包含所依附实体的主键。
E-R 图
  • 用图形表示实体、属性、联系;
  • 只关心数据内容与关系,不关心存储与 DBMS。
扩充 E-R(EER)
  1. 特殊化与普遍化
    • 特殊化:从一般到特殊(如"学生"→"研究生");
    • 普遍化:从特殊到一般;
    • 子实体继承父实体的属性和联系。
  2. 聚集(Aggregation)
    • 将联系视为新实体,其属性 = 参与实体属性 + 联系属性。
  3. 范畴(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 大部分

  1. 数据定义语言(DDL):定义、撤消、修改数据模式(表、视图、索引等);
  2. 查询语言(QL):查询数据;
  3. 数据操纵语言(DML):增、删、改数据;
  4. 数据控制语言(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 约束)。

📌 例 3-1:定义 STUDENT、COURSE、SC 三表,含主键、外键、DEFAULT、ON DELETE 等完整语法。

3.3.3 基表模式的修改(ALTER TABLE)(重点)

SQL 提供 7 种修改命令

  1. 增加列

    sql 复制代码
    ALTER TABLE [创建者名.]表名 ADD 列名 类型;

    注:SQL 未提供删除列的命令(需重建表实现)。

  2. 删除基表

    sql 复制代码
    DROP TABLE 表名;
  3. 补充定义主键

    sql 复制代码
    ALTER TABLE 表名 ADD PRIMARY KEY (列名表);
  4. 撤消主键定义 (提升插入效率):

    sql 复制代码
    ALTER TABLE 表名 DROP PRIMARY KEY;
  5. 补充定义外键

    sql 复制代码
    ALTER TABLE 表名-1 ADD FOREIGN KEY [外键名] (列名表) REFERENCES 表名-2 [ON DELETE {RESTRICT \| CASCADE \| SET NULL}];
  6. 撤消外键定义 (提升性能):

    sql 复制代码
    ALTER TABLE 表名 DROP 外键名;
  7. 定义和撤消别名 (SYNONYM):

    sql 复制代码
    CREATE SYNONYM 标识符 FOR 创建者名.表名/视图名;
    DROP SYNONYM 标识符;
3.3.4 索引的建立和撤消(CREATE/DROP INDEX)
  • 语法 (图 3-2):

    sql 复制代码
    CREATE [UNIQUE] INDEX 索引名 ON 表名 (列名 [ASC/DESC], ...);
    DROP INDEX 索引名;
  • UNIQUE:索引属性值唯一(用于主键/候选键);

  • ASC(升序,默认)、DESC(降序)。

📌 示例

sql 复制代码
CREATE 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):

    sql 复制代码
    SELECT [DISTINCT] 查询项
    FROM 表/视图名
    [WHERE 条件]
    [GROUP BY 列名]
    [ORDER BY 列名 [ASC/DESC]];
  • 各子句作用

    • SELECT必需,指定查询列或表达式;
    • FROM必需,指定查询表/视图;
    • WHERE:任选,筛选条件;
    • GROUP BY:任选,分组
    • ORDER BY:任选,排序
3.4.2 复杂查询写法(多表查询)(重点)
  • 三种等价写法 (以"选修 CS-221 的学生"为例):

    1. 连接查询 (笛卡尔积 + 条件):

      sql 复制代码
      SELECT STUDENT.SNO, SNAME
      FROM STUDENT, SC
      WHERE STUDENT.SNO = SC.SNO AND CNO = 'CS-221';
    2. 嵌套查询 (IN 子查询):

      sql 复制代码
      SELECT SNO, SNAME
      FROM STUDENT
      WHERE SNO IN (SELECT SNO FROM SC WHERE CNO = 'CS-221');
    3. 存在量词嵌套查询 (EXISTS):

      sql 复制代码
      SELECT 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 升序排列:

sql 复制代码
SELECT 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

sql 复制代码
SELECT SNO FROM STUDENT WHERE YEAR(BDATE) = 1973
UNION
SELECT SNO FROM SC WHERE CNO LIKE 'EE%';

3.5 SQL 数据操纵语言(DML)

3.5.1 INSERT 语句
  • 插入单个元组

    sql 复制代码
    INSERT INTO 表名 VALUES (值1, 值2, ...);
  • 插入部分字段 (其余为 DEFAULT/NULL):

    sql 复制代码
    INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);
  • 从查询结果插入 (批量插入):

    sql 复制代码
    INSERT INTO 表名 SELECT ... FROM ...;
3.5.2 DELETE 语句
  • 删除满足条件的元组

    sql 复制代码
    DELETE FROM 表名 WHERE 条件;
  • 无 WHERE 子句 → 删除所有元组(表变空,非 DROP)。

3.5.3 UPDATE 语句
  • 更新满足条件的元组

    sql 复制代码
    UPDATE 表名 SET 列 = 表达式 WHERE 条件;
  • 无 WHERE 子句 → 更新所有元组


3.6 SQL 中的视图

3.6.1 普通视图
  • 定义

    sql 复制代码
    CREATE VIEW 视图名 [(列名)] AS SELECT 语句;

    ✅ 视图不能使用 UNIONORDER BY 等(PDF 明确指出)。

  • 撤消

    sql 复制代码
    DROP VIEW 视图名;
  • 特点 (重点):

    • 动态性 :视图内容随基表更新而实时变化
    • 更新限制 (PDF 明确列出):
      • 单表 定义的视图,只有含主键/候选键且无表达式/函数,才允许更新;
      • 多表连接 定义的视图不允许更新
      • GROUP BY聚集函数 的视图不允许更新
  • 视图优点 (重点):

    1. 逻辑数据独立性:模式变化时,只需改视图,应用不变;
    2. 简化用户观点:用户只关心视图,不需处理多表连接;
    3. 数据安全保护 :通过视图限制用户可见数据
3.6.2 临时视图和递归查询(重点)
  • 临时视图

    • WITH 定义(非 CREATE VIEW);
    • 仅用于紧随其后的查询语句
    • 查询结束后自动消失无需 DROP
  • 递归查询 (PDF 以路径查询为例):

    sql 复制代码
    WITH 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 特性(重点)
  1. Atomicity(原子性)
    • "不做任何事,或做所有事"(Do nothing or do all)。
  2. Consistency(一致性)
    • 事务应使数据库从一个一致状态 转变到另一个一致状态
  3. Isolation(隔离性)
    • 多个事务并发执行时,应如同每个事务独立执行
    • "并发控制" 机制保证。
  4. 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 核心进程
  • 优点:易于实现。
  • 缺点
    1. 进程创建、撤销、通信、切换开销大;
    2. 并发事务增加 → 进程数剧增 → 内存受限 → 性能下降;
    3. 不利于事务共享内存空间
(2)单进程多线程结构(重点)
  • 线程 :现代操作系统引入的概念,是程序并发执行的单位
    • 一个进程可创建多个线程;
    • 同一进程的线程共享进程资源
    • 线程所需资源少于进程;
    • 线程切换和通信开销小
  • DBMS 实现
    • 系统只创建一个 DBMS 进程;
    • 进程内包含:
      • 常驻的公共服务线程
      • 按用户请求创建的用户线程
  • 优势
    • 并发从进程级 提升到线程级
    • 大幅提升数据库并发能力
DBMS 自主线程管理的原因(重点)
  1. 可按 DBMS 需要确定线程调度策略
  2. 线程在用户态切换 ,无需进入操作系统核心态,切换开销小
  3. 可在不支持线程的操作系统 上运行,提高可移植性
操作系统需提供的支持
  1. 非阻塞 I/O 和异步 I/O
  2. 公平调度
    • 多线程 DBMS 进程不应被当作普通进程对待,应被区别调度

4.4 DBMS 的系统结构

(1)分时环境下的集中式数据库系统结构
  • 数据库建在本单位主计算机上;
  • 用户通过终端分时访问
  • 所有功能(从接口到核心)集中在 DBMS 所在计算机
  • 数据及其管理完全集中
(2)网络环境下的客户/服务器(C/S)结构
  • 客户端 :面向用户,接受任务,将需服务器完成的部分委托给服务器
  • 服务器端:运行 DBMS 核心部分;
  • 特点处理分布,数据集中
  • 客户端可有自己的局部 DBMS
(3)物理分布、逻辑集中的分布式数据库
  • 背景 :企业规模扩大、地理分散,集中式系统暴露问题:
    • 通信开销高
    • 效率低
    • 可扩展性差
    • 管理困难
  • 特点
    • 数据物理上分布于各部门计算机;
    • 全局统一数据模式 ,实现所有节点对所有数据的约定访问
    • 用户看到的是逻辑上集中的数据库
    • "数据就近存取" 是核心思想。
  • 缺点 :全局数据模式难设计、管理、扩充和修改(类比"高度集中的计划经济")。
(4)物理分布、逻辑分布的分布式数据库(联邦式)
  • 特点
    1. 节点自治(Node autonomy);
    2. 无需全局数据模式
  • 每个节点包含两类数据模型
    1. 本节点的局部数据模型
    2. 本节点共享的其他节点的数据模型
  • 优点
    • 节点模式修改、节点加入/撤离,仅影响相关节点
    • 灵活性、可扩展性强
  • 又称为联邦式数据库系统(Federated Distributed Database System)。

4.5 数据目录(Data Catalog)(重点)

基本概念
  • 数据目录 :存储描述数据模式的数据
  • 也称为 元数据(Meta-data)
  • 用于长期管理大量共享、持久的数据
组成
  • 通常由若干系统表 组成,例如:
    • SYSTAB(系统表)
    • SYSCOL(系统列)
    • SYSIDX(系统索引)
    • SYSVIEW(系统视图)
    • SYSVWATR(视图属性)
特点
  • 既是数据,又不同于一般数据
  • 在关系数据库中,以表的形式存在,可被查询;
  • 主要服务于 DBMS 自身
  • 只能由系统定义和拥有
  • 系统初始化时自动生成(类比编译器的符号表,具有递归初始特性)。
元数据分类
  1. 相对稳定的数据
    • 基表、视图、索引的定义;
  2. 频繁变化的数据
    • 数据库状态统计信息(如元组数、不同属性值个数等);
    • 主要用于查询优化
    • 可定期更新,不要求绝对准确
重要性
  • 数据目录是影响系统全局的、以读为主的数据
  • 对系统效率影响很大

重点内容总结

  • 核心重点
    • 事务的 ACID 特性COMMIT/ROLLBACK 语义
    • DBMS 单进程多线程结构 及其优势
    • 数据目录(元数据)的组成与作用
  • 次重点
    • DBMS 的两种实现方式(编译/解释)
    • C/S 与分布式数据库结构(集中式 vs 联邦式)
    • 操作系统对 DBMS 线程的支持要求

第5章 数据库的存储结构(Storage Structure of Database)

5.1 数据库存储介质的特点(重点)

  • 多级存储器结构 :数据库主要使用辅存 (secondary storage),其中磁盘是最常用的辅存。
  • 光盘速度慢、价格高近期无法取代硬盘
  • 磁带顺序存取存储器 ,通常用作后备存储器(backup memory)。
  • 内存不适合作为主要数据库存储介质
  • 活动头磁盘的存取时间 由三部分组成:
    1. 寻道时间(seeking time)
    2. 等待时间(waiting time,即旋转延迟)
    3. 传输时间(transmission time)
  • 磁盘与内存间的数据交换以物理块为单位
    • 优点:
      1. 减少 I/O 次数 → 降低寻道和等待时间
      2. 减少存储间隙 → 提高磁盘空间利用率
    • 块大小由操作系统决定
  • **缓冲区(buffer)**用于解决磁盘与内存速度不匹配问题。
    • 支持重叠操作:一边读写磁盘,一边处理数据。
    • 多个缓冲块可供申请使用
  • 操作系统和 DBMS 各自设置缓冲机制
  • DBMS 采用延迟写 (delayed writing):
    • 提前读:预读可能用到的块
    • 延迟写:暂缓写回,合并写操作

重点:物理块是 I/O 单位;缓冲与提前读/延迟写是提升 I/O 性能的关键手段。


5.2 记录的存储结构(重点)

5.2.1 记录的内部表示方式(三种方法)
  1. 定位法 (Positioning Method)
    • 每个字段分配固定长度(按最大可能长度)
    • 示例:LIbbb(5字符,不足补空格)
  2. 相对法 (Relative Method)
    • 字段间用特殊分隔符 (如 ?, #)隔开
    • 问题:若字段内容含分隔符,需转义处理
  3. 计数法 (Counting Method)
    • 每个字段前加长度计数 (如 02LI04MING...
    • 要求:字段实际长度 ≤ 计数位能表示的最大值
5.2.2 记录在物理块上的分配方式
  • 记录类型:固定长度 / 可变长度

  • 两种分配策略

    1. 记录跨块存储 (Spanned block storage)
      • 允许一个记录跨越多个物理块
      • 优点:充分利用碎片空间
      • 缺点:寻址复杂
    2. 记录不跨块存储 (Unspanned)
      • 每个记录必须完整存于一个块内
      • 可能造成块内空间浪费
  • 块因子 (blocking factor)p = [B / R]

    • B:物理块有效大小
    • R:固定长度记录大小
    • p:每块可存放记录数

重点:跨块存储节省空间但增加寻址复杂度;块因子影响 I/O 效率。


5.3 文件结构与存取路径(重点)

5.3.1 文件访问的五类需求
  1. 查询文件中全部或大量记录(≥15%)
  2. 查询特定记录
  3. 查询部分记录
  4. 范围查询(Range query)
  5. 更新记录
5.3.2 数据库对文件管理的要求(重点)

传统 OS 文件系统不适用于 DBMS,原因:

  • 无法提供 DBMS 所需的附加元数据(如索引、统计信息)
  • 面向批处理 ,而 DBMS 要求即时访问与动态修改
  • 共享度低,用途单一
  • 数据量变化大,而传统文件数据量相对稳定
  • 减少对 OS 依赖可提高 DBMS 可移植性

结论 :多数 DBMS 独立设计存储结构,不依赖 OS 文件系统。

5.3.3 数据库中的基本文件类型(重点)
  1. 堆文件(Heap File)

    • 记录按插入顺序存储
    • 唯一存取路径:顺序扫描
    • 插入高效,查询低效(平均访问 (N+1)/2 条记录)
    • 删除记录 :可加删除标记,定期集中整理
    • 若排序后可用二分查找,但排序代价高
  2. 直接文件(Direct File / Hash File)

    • 使用散列函数 H(key) → address
    • 散列键(hash key)决定记录地址
    • 问题
      • 地址重叠(冲突)需额外处理
      • 仅对散列键查询高效
      • 不适合可变长记录
      • 难以设计通用散列函数
    • 应用受限,在 DBMS 中不广泛使用
  3. 索引文件(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⁺-树的约束条件
  1. 每个节点最多有 2k 个键值(k,order)
  2. 根节点至少 1 个键值,其他节点至少 k
  3. 节点内键值有序存放
  4. 若节点有 J 个键值,则有 J+1 个子女(除叶节点)
  5. 所有叶节点在同一层树始终保持平衡
B⁺-树的插入与删除
  • 插入
    • 若叶节点已满(2k 个键值),分裂为两个节点
    • 分裂可能向上传播,直至根节点(根分裂则树高 +1)
  • 删除
    • 若删除后键值数 < k,尝试向兄弟借键值
    • 若兄弟也无法借,则合并节点,可能向上传播
B⁺-树的结构(两类节点)
  1. 索引集节点 (内部节点)
    • 格式:P₀ K₀ P₁ K₁ ... Kₙ₋₁ Pₙ
  2. 顺序集节点 (叶节点)
    • 格式:前向指针 后向指针 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,000L < 5最多 4 次 I/O 找到叶节点

B⁺-树提供的三种存取路径(重点)
  1. 通过索引集进行树形搜索(点查询)
  2. 通过顺序集进行顺序搜索(范围查询)
  3. 先通过索引找到入口,再沿顺序集顺序搜索(范围查询优化)
其他要点
  • 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):
    是查询处理中的重要一环,对关系数据库尤其重要
  • 优化是相对的
    可能的执行策略很多,穷尽代价很大,不能片面追求绝对最优
  • 两种执行方式
    1. 解释方式 (Interpretation execution)
      • 优化占执行时间;
      • 适用于简短的即时查询,灵活实用。
    2. 编译方式 (Compile mode execution)
      • 优化不占执行时间;
      • 适用于频繁执行的 SQL 事务,可提高性能。

6.2 代数优化(Algebraic Optimization)(重点)

  • 目标 :对查询进行等效变换 ,以减少执行开销
  • 核心原则尽量减小查询过程中间结果的大小
    • 选择(σ)、投影(Π)操作通常能有效减小关系大小;
    • 连接、笛卡尔积、并操作易生成较大中间结果。
常用等价变换规则(重点)
  1. 选择串接律
    σ~c1 ∧ c2 ∧ ... ∧ cn~® ≡ σc1c2(...σcn®...))
  2. 选择交换律
    σc1c2®) ≡ σc2c1®)
  3. 投影串接律
    Πlist1list2(...Πlistn®...)) ≡ Πlist1®,其中 list1 ⊆ list2 ⊆ ... ⊆ listn
  4. 选择与投影交换律
    若属性集 {A1,...,An} ⊆ Attr©,则
    ΠA1,...,AnC®) ≡ σCA1,...,An®)
  5. 连接交换律
    R ⋈ S ≡ S ⋈ R
  6. 选择对连接的分配律
    若 Attr© ⊆ Attr®,则
    σC(R ⋈ S) ≡ σC® ⋈ S
  7. 合取条件拆分
    若 Attr(c1) ⊆ Attr®,Attr(c2) ⊆ Attr(S),则
    σ~c1 ∧ c2~(R ⋈ S) ≡ σc1® ⋈ σc2(S)
  8. 投影对连接的分配律(略,原文公式复杂)
  9. 选择对集合运算的分配律(∩, ∪, −)
  10. 投影对集合运算的分配律
  11. 连接与笛卡尔积的转换
    (R ⋈c1 S) ⋈c2 T ≡ R ⋈~c1 ∧ c2~ (S × T),当 S 与 T 无连接条件时
代数优化基本步骤(重点)
  1. 生成原始查询树
    • SELECT → 投影
    • FROM → 笛卡尔积
    • WHERE → 选择
  2. 选择操作下推
    应用规则 2、6、7、9、10,将选择尽可能移向树叶。
  3. 调整连接顺序
    小关系优先原则,重新安排连接顺序。
  4. 合并选择与笛卡尔积为连接操作
  5. 消除无用属性
    对每个叶节点加必要投影,去除对查询无用的属性。
嵌套查询的优化
  • 与上层无关的嵌套查询:从最内层开始,逐层计算。
  • 与上层相关的嵌套查询 :一般用代入法
    • 将上层查询涉及表的每条记录代入内层,R1.A1 视为常量。
    • 注意 :尽可能做"部分选择",减少代入的元组数。

6.3 依赖于存取路径的规则优化(重点)

代数优化不涉及存取路径,优化效果有限。合理选择存取路径能显著提升性能

6.3.1 选择操作的实现和优化
  • 选择条件类型:等值、范围、集合(IN/EXISTS)、复合(AND/OR)
  • 存取路径选择的启发式规则 (重点):
    1. 小关系 → 顺序扫描;
    2. 无索引 / 选取比例 > 20% / 无簇集索引 → 顺序扫描;
    3. 主键等值选择 → 优先用主键索引或散列;
    4. 非主键等值选择
      • 选取比例 < 20% → 用无序索引
      • 否则 → 用簇集索引或顺序扫描;
    5. 范围条件
      • 用索引找边界,再沿顺序集搜索;
      • 若比例大 → 用簇集索引或顺序扫描;
    6. AND 条件
      • 优先用多属性索引
      • 或用多个次索引做预查找
      • 或逐个条件筛选;
    7. OR 条件(重点)
      • 无好方法,只能分别选出元组集,再求并;
      • 只要一个条件无合适存取路径,就必须顺序扫描
6.3.2 连接操作的实现和优化(重点)
  • 实现方法

    1. 嵌套循环法 (Nested Loop)
      • 外关系 R,内关系 S;
      • I/O 次数:bR + [bR/(nB−1)] × bS
      • 应将物理块数少的关系作外关系
    2. 利用索引/散列法
      • 内关系需有连接属性上的索引;
      • 簇集索引效果最明显
      • 若匹配元组比例 > 15%,索引可能不如顺序扫描。
    3. 排序归并法 (Sort-Merge)
      • 两关系均已按连接属性排序时优先使用;
      • 等值匹配时效率高。
    4. 散列连接法 (Hash Join)
      • 用相同散列函数将 R、S 散列到同一文件;
      • 注意:h(A)=h(B) 不一定 ⇒ A=B,仍需按 A=B 检查。
  • 连接方法选择的启发式规则(重点):

    1. 两关系均已排序 → 优先用排序归并
    2. 一个关系在连接属性上有索引/散列 → 用索引法
    3. 无上述条件且关系较小 → 用嵌套循环
    4. 其他情况 → 用散列连接
6.3.3 投影操作的实现
  • 通常与选择、连接同时进行,无附加 I/O;
  • 若投影属性不含主键 → 可能有重复元组;
  • 去重方法:排序法、散列法。
6.3.4 集合操作
  • 并、交、差
    • 可用排序法(按主键排序后扫描);
    • 散列法(散列到同一文件,检查重复)。
  • 笛卡尔积
    • 用嵌套循环实现;
    • 结果大、耗时高,应尽量少用
6.3.5 组合操作
  • 多个操作可组合执行 ,如:
    • 扫描外关系时同步执行其选择、投影,并存入临时文件;
    • 生成连接结果时同步执行最终投影。

6.5 结束语(优化策略分类)

  • 静态优化
    • 执行前优化;
    • 仅利用统计数据,不一定准确
  • 动态优化
    • 执行时优化;
    • 用实际执行结果估算代价,更符合实际
    • 增加执行时间不利于并行性

重点内容总结

  • 核心重点
    • 代数优化的5个基本步骤(选择下推、小关系优先、消除无用属性)
    • OR 条件导致必须顺序扫描
    • 连接操作的4种实现方法及选择规则
    • 选择操作的7条存取路径启发式规则
    • 嵌套查询的代入法与部分选择优化
  • 次重点
    • 解释方式 vs 编译方式的适用场景
    • 投影去重的排序/散列法
    • 集合操作的实现
    • 静态 vs 动态优化的优劣

第7章 事务管理(Transaction Management)

  • 事务管理包含两大技术
    1. 恢复(Recovery):保证事务在数据库发生故障后满足 ACID 准则;
    2. 并发控制(Concurrency Control):保证事务在并发执行时满足 ACID 准则。

7.1 恢复引论(Recovery Introduction)

故障处理的两种措施
  1. 尽可能提高系统可靠性;
  2. 恢复(Recovery):发生故障后,将数据库恢复至一致状态。
恢复技术的三种类型
  1. 单纯以后备副本为基础的恢复技术
    • 周期性将数据库转储(dump)到磁带(脱机存储);
    • 增量转储(ID):仅转储变化部分;
    • 优点:实现简单,不增加运行开销;
    • 缺点不能恢复到最近一致状态
    • 适用:小型、非关键系统。
  2. 以后备副本和运行记录为基础的恢复 (重点)
    • 运行记录 (log/journal)包含:
      • 前像 (Before Image, BI):更新前的物理块映像 → 用于 undo
      • 后像 (After Image, AI):更新后的物理块映像 → 用于 redo
      • 事务状态:记录事务是否 COMMIT。
    • 恢复过程
      • 取最近后备副本;
      • 未提交事务 ,用 BI undo(向后恢复);
      • 已提交事务 ,用 AI redo(向前恢复);
    • 优点 :可恢复到最近一致状态
    • 缺点:需维护 log,影响正常运行速度;
    • 适用大多数商品化 DBMS
  3. 基于多副本的恢复技术
    • 利用多个 DB 副本互为备份;
    • 镜像磁盘(Mirrored Disks):两个磁盘同时写入,一盘失效可用另一盘恢复;
    • 适用:分布式数据库、高可靠性系统。

7.2 运行记录的结构(Log Structure)(重点)

  • log 不能与数据库放在同一磁盘,以防"全军覆没"。
  • log 基本内容
    1. 活动事务表 (ATL):记录所有未提交事务的 TID;
    2. 提交事务表 (CTL):记录所有已提交 事务的 TID;
      • 提交顺序:先写 CTL,再从 ATL 删除 TID;
    3. 前像文件:堆文件结构,每个块有 BID(TID + 关系名 + 逻辑块号);
    4. 后像文件:结构同前像文件,存 AI。
  • undo 和 redo 满足幂等性
    • undo(undo(x)) = undo(x)
    • redo(redo(x)) = redo(x)
  • 减小 log 规模的方法
    1. 不保留已提交事务的前像;
    2. 有选择地保留后像;
    3. 合并同一逻辑块的多次后像,只保留最新。

7.3 更新事务的执行与恢复(重点)

两条基本规则
  1. 提交规则 (Commit Rule):
    • 后像必须在事务提交前写入非易失存储器(DB 或 log)。
  2. 先记后写规则 (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 过程:
      1. 暂停事务;
      2. 写入后像;
      3. 在 log 的 CTL 中记录 CP;
      4. 恢复事务。
    • CTL 清空时机取后备副本后
3. 介质失效(Media Failure)
  • 原因:磁盘物理损坏;
  • 恢复措施
    1. 修复/更换磁盘;
    2. 重启系统(如需要);
    3. 加载最近后备副本
    4. redo 后备副本之后所有已提交事务(包括 CP 之前)。

7.7 并发控制(Concurrency Control)

7.7.1 并发方式
  • 串行访问:事务顺序执行;
  • 并发访问
    • 交叉并发(单 CPU)
    • 同时并发(多 CPU)
7.7.2 并发目的
  1. 提高系统资源利用率;
  2. 改善短事务响应时间。
7.7.3 并发引起的问题(重点)
  1. 丢失更新 (Lost Update)
    • 两事务并发写同一数据 → 写-写冲突
  2. 读脏数据 (Dirty Read)
    • 读取未提交事务的中间结果 → 读-写冲突
  3. 不可复现读 (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 活锁
  • 死锁:循环等待;
  • 活锁:事务无限等待(如总被更高优先级抢占)。
死锁检测
  1. 超时法:等待超时即判死锁;
  2. 等待图法
    • 顶点:事务;
    • 边:Ti 等待 Tj;
    • 有环 → 死锁
死锁处理
  1. 牺牲者(最年轻、undo 代价最小);
  2. 终止牺牲者,释放所有锁;
  3. 等待后重启动。
死锁防止
  1. 一次性申请所有锁
  2. 按编号顺序加锁
  3. 时间戳法
    • 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章 数据库的安全和完整性约束

  • 数据库的破坏来源

    1. 系统故障
    2. 并发引起的数据不一致
    3. 人为破坏
    4. 数据语义错误或错误操作引起的不一致
  • 本章核心内容

    • 数据库的安全保护(security protection)
    • 数据完整性约束(integrity constraints)

8.1 数据库的安全保护

  • 前提 :DBMS 建立在 OS 之上,OS 应保证所有对数据库的访问必须经由 DBMS不允许用户绕过 DBMS 直接通过 OS 访问数据
8.1.1 视图的定义和查询修改(重点)
  • 作用 :通过定义视图,限制各个用户的访问范围
  • 替代机制 :某些 DBMS 无显式视图功能,但可根据用户访问限制条件自动修改查询条件,使其只能在指定范围内查询。
8.1.2 访问控制(Access Control)(重点)
  • 定义:对用户访问数据库各种资源(基表、视图、目录、实用程序等)的权限进行控制。
  • 操作权限:创建、撤销、查询、增、删、改等。
  • 独立性:同一 DBMS 下多个数据库的访问控制相互独立。
用户分类
  1. 一般数据库用户
  2. 具有支配部分资源权限的用户
  3. 具有 DBA 特权的用户
角色机制(重点)
  • 问题:若多个用户权限相同,逐个授权繁琐。
  • 解决方案 :定义角色(role),对角色授权。
  • 规则
    • 用户承担某角色 → 拥有该角色权限;
    • 一个用户可拥有多个角色及其他权限;
    • 角色不是用户,不能用于登录

8.3 完整性约束检查

注:原文未包含 8.2 节,直接跳至 8.3。

8.3.1 完整性约束的类型(重点)

以关系数据模型为例,分为:

1. 静态约束(Static Constraints)
  • (1) 固有约束 (Inherent Constraints)
    • 例如:第一范式(1NF)
  • (2) 隐含约束 (Implicit Constraints)
    • 用 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 TABLEFOR EACH STATEMENT

重点内容总结

  • 核心重点
    • 访问控制与角色机制
    • 完整性约束的三类说明方法(过程/断言/触发器)
    • 触发器的三要素(Event/Condition/Action)
    • 引用完整性规则的触发器实现(5条核心规则)
    • 语句级 vs 行级触发器的区别 (如规则6使用 FOR EACH STATEMENT
  • 次重点
    • 视图在安全保护中的作用
    • 主动数据库系统的概念
    • 静态约束与动态约束的区分

相关推荐
Pocker_Spades_A2 小时前
AI Ping 上线 GLM-4.7 与 MiniMax M2.1:两款国产旗舰模型免费用!
大数据·数据库·人工智能
客梦2 小时前
数据结构--排序
数据结构·笔记
先生沉默先2 小时前
c#Socket学习,使用Socket创建一个在线聊天,日志笔记(5)
笔记·学习·c#
峰顶听歌的鲸鱼2 小时前
20.MySql数据库
运维·数据库·笔记·mysql·云计算·学习方法
_Kayo_2 小时前
css 练习笔记1
前端·css·笔记
G_H_S_3_2 小时前
【网络运维】SQL 语言:MySQL数据库基础与管理
运维·网络·数据库·mysql
IvanCodes2 小时前
openGauss 高级特性:优化器、存储引擎与分区管理
数据库·sql·opengauss
峰顶听歌的鲸鱼2 小时前
19.docker 图形化管理界面
运维·笔记·docker·容器·学习方法
DemonAvenger2 小时前
Redis主从复制原理与实战:构建高可用缓存架构
数据库·redis·性能优化