第一部分 数据库原理 3
第1章 数据库基础知识 3
1.1 数据管理技术的发展 3
1.1.1 数据和数据处理 3
1.1.2 数据管理的三个阶段 4
1.2 数据库的基本概念 5
1.2.1 数据库系统 5
1.2.2 数据模型 8
1.2.3 数据库的发展 9
1.2.4 数据库分类 11
1.3 DBMS体系结构 12
习题1 13
第2章 关系数据模型 15
2.1 关系模型基础 15
2.1.1 基本术语 15
2.1.2 关系的数学定义 17
2.2 关系代数 19
2.2.1 传统的集合运算 20
2.2.2 专门的关系运算 22
2.2.3 关系演算 24
2.3 基于包的关系代数 25
2.3.1 传统的集合运算 25
2.3.2 专门的关系运算 27
2.4 关系的三类完整性约束 27
2.4.1 实体完整性约束 28
2.4.2 参照完整性约束 28
2.4.3 用户自定义的完整性约束 29
实验 畅想数据库管理系统 29
习题2 32
第3章 结构化查询语言(SQL) 35
3.1 SQL概述 35
3.1.1 SQL的标准和特点 35
3.1.2 SQL的术语 36
3.1.3 RDBMS的体系结构 37
3.2 数据定义 38
3.2.1 数据类型 38
3.2.2 定义基表 40
3.2.3 修改与删除基表 44
3.3 基本数据查询 45
3.3.1 SELECT语句的语法 45
3.3.2 单表查询 45
3.3.3 分组统计查询 49
3.4 连接查询 51
3.4.1 交叉连接 51
3.4.2 内连接 52
3.4.3 外连接 53
3.4.4 多表连接查询 56
3.5 数据更新 57
3.5.1 数据插入 57
3.5.2 数据修改 58
3.5.3 数据删除 59
3.6 复杂的查询条件 60
3.6.1 查询条件表达式的语法 60
3.6.2 空值的判断 62
3.6.3 针对字符数据的查询 62
实验 SQL实验 64
习题3 67
第4章 数据库对象 69
4.1 视图 69
4.1.1 视图的概念 69
4.1.2 创建和删除视图 70
4.1.3 修改视图 71
4.1.4 使用视图数据 71
4.2 索引 72
4.2.1 索引的概念 72
4.2.2 使用索引 73
4.3 序列 73
实验 使用数据库对象 75
4.4 存储过程 75
4.5 触发器 77
习题4 78
第5章 数据的安全性 79
5.1 事务和锁的概念 79
5.1.1 事务的概念 79
5.1.2 事务的ACID特性 80
5.1.3 事务生命周期 82
5.1.4 锁 83
5.2 使用事务 83
5.2.1 用户、连接和事务的关系 83
5.2.2 显式模式 84
5.2.3 隐性模式 85
5.2.4 自动提交模式 86
5.3 特殊事务模型 86
5.3.1 嵌套事务 86
5.3.2 保存点 87
5.3.3 分布式事务 87
实验 事务的并发与隔离 88
5.4 SQL中的授权机制 92
5.4.1 用户 92
5.4.2 权限 92
5.4.3 授权 93
5.4.4 解除授权 93
习题5 94
第二部分 数据库设计与开发 97
第6章 关系模式的规范化 97
6.1 问题提出 97
6.2 函数依赖和模式分解 99
6.2.1 函数依赖 99
6.2.2 模式分解 101
6.3 关系范式 102
6.3.1 第一范式 104
6.3.2 第二范式 105
6.3.3 第三范式 107
6.3.4 非规范化 108
6.4 Boyce-Codd范式(BCNF) 109
实验 规范化设计案例 111
习题6 111
第7章 数据库设计与建模 113
7.1 数据库设计的工作 113
7.2 数据库系统的设计方法及步骤 116
7.3 概念模型设计与ER模型 118
7.3.1 基本ER元素 118
7.3.2 高级ER元素 123
7.3.3 建立ER模型 125
7.4 逻辑模式设计 128
7.4.1 概念模型向关系模式的转换 129
7.4.2 继续转换为逻辑模式 134
7.5 选择索引 135
7.5.1 单个索引的收益 135
7.5.2 主键上的索引 136
7.5.3 索引的选择 136
实验 数据库建模实验 137
习题7 137
第8章 数据库应用程序开发 139
8.1 数据库系统的体系结构 139
8.1.1 数据库的访问 139
8.1.2 几种常见的体系结构 140
8.1.3 三层体系结构 142
8.2 应用程序接口 142
8.2.1 ODBC 143
8.2.2 JDBC 143
实验 使用ODBC连接数据库 145
习题8 146
第三部分 DBMS的实现 149
第9章 DBMS的设计 149
9.1 需求分析 149
9.1.1 关于数据量 150
9.1.2 关于并发度 151
9.1.3 CXDB教学版简介 152
9.2 接口设计 153
9.2.1 数据接口设计 153
9.2.2 语言接口设计 153
9.2.3 编程接口设计 154
9.3 总体设计 155
9.3.1 总体设计的任务 155
9.3.2 DBMS的一般体系结构 156
9.3.3 CXDB-E的体系结构 158
实验 基于CXDB-E的编程 160
习题9 161
第10章 存储管理 163
10.1 数据存储技术概述 163
10.1.1 存储器的层次 163
10.1.2 磁盘的读写 164
10.1.3 磁盘调度 165
10.1.4 磁盘缓存 166
10.1.5 提高磁盘I/O速度的方法 166
10.1.6 RAID 167
10.2 数据在文件中的组织 168
10.2.1 CXDB-E文件格式 168
10.2.2 CXDB-E的文件头格式 169
10.3 页的寻址 170
实验 CXDB-E的存储管理 171
习题10 171
第11章 数据缓冲 173
11.1 数据缓冲层概述 173
11.1.1 缓冲区的概念 173
11.1.2 散列表 174
11.2 缓冲区管理 175
11.2.1 文件页和缓冲区页 175
11.2.2 缓冲区管理的功能 177
11.2.3 缓冲区的大小 178
11.3 缓冲区替换策略 179
实验 CXDB-E的数据缓冲 181
习题11 181
第12章 数据操纵 183
12.1 记录的存储技术 183
12.1.1 记录在页中的存放 183
12.1.2 记录的寻址 185
12.1.3 溢出页的使用 185
12.2 CXDB-E的数据页格式 186
12.2.1 数据记录格式 186
12.2.2 数据页格式 187
12.2.3 溢出页格式 188
12.2.4 空闲页格式 189
12.3 游标 190
12.3.1 游标种类 190
12.3.2 游标操作 190
12.3.3 游标结构 191
实验 CXDB-E的记录操纵 192
习题12 193
第13章 索引技术 195
13.1 索引技术概述 195
13.2 B树索引 197
13.2.1 B树的概念 197
13.2.2 B树的基本算法 198
13.2.3 B树基本算法的讨论 202
13.2.4 B+树 203
13.3 CXDB-E的索引页格式 204
13.4 用于索引的B树算法 205
13.4.1 需要考虑的问题 205
13.4.2 算法 206
实验 CXDB-E的索引操纵 213
13.5 其他索引技术 214
13.5.1 散列索引 214
13.5.2 位图索引 215
13.5.3 多维索引 215
习题13 216
第14章 查询处理 217
14.1 查询处理的一般过程 217
14.1.1 编译 218
14.1.2 优化 219
14.1.3 执行 220
14.2 物理查询计划操作符 220
14.2.1 关系的扫描 221
14.2.2 物理操作符的代价计算模型 221
14.2.3 衡量代价的参数 221
14.2.4 两阶段多路归并排序 222
14.2.5 物理操作符迭代器 224
14.2.6 算法分类 225
14.3 选择操作 226
14.4 连接操作 228
14.4.1 一趟算法 228
14.4.2 嵌套循环连接 228
14.4.3 基于排序的两趟算法 229
14.4.4 基于散列的两趟算法 231
14.4.5 基于索引的算法 232
14.5 聚合操作 233
14.5.1 一趟算法 234
14.5.2 基于排序的两趟算法 235
14.5.3 基于散列的两趟算法 236
14.5.4 基于索引的算法 236
14.6 关系代数的等价性定律 236
14.6.1 交换律和结合律 236
14.6.2 与选择有关的定律 237
14.6.3 与投影有关的定律 238
14.6.4 与连接和积有关的定律 238
14.6.5 与分组和聚合有关的定律 238
14.7 选择逻辑查询计划 238
14.7.1 将分析树转换为关系代数表达式树 239
14.7.2 逻辑查询计划的优化 240
14.8 选择物理查询计划 241
习题14 242
第15章 CXDB-E的SQL层 245
15.1 SQL语句的编译 245
15.1.1 编译的一般步骤 246
15.1.2 lex与yacc介绍 246
15.1.3 SQL语句的语法描述 248
15.1.4 SQL语句的内存结构 249
15.2 CXDB-E的查询处理 250
15.2.1 语义分析 251
15.2.2 选择查询计划 252
15.2.3 查询执行 256
15.2.4 条件表达式向索引的转换 259
实验 SQL层的实现 259
习题15 260
第16章 事务管理 261
16.1 事务调度 261
16.1.1 串行调度和并行调度 262
16.1.2 可串行化 265
16.1.3 冲突可串行化 266
16.2 事务隔离级别 267
16.2.1 并行调度造成的不一致现象 267
16.2.2 事务隔离级别 269
16.3 并发控制 270
16.3.1 并发控制的分类 270
16.3.2 基于锁的并发控制 270
16.4 锁的类型 271
16.4.1 共享锁与排他锁 271
16.4.2 锁的相容矩阵 271
16.4.3 锁升级 272
16.4.4 更新锁 273
16.4.5 意向锁 274
16.5 封锁粒度和封锁协议 275
16.5.1 锁的粒度 275
16.5.2 两段锁协议 276
16.6 加锁产生的问题 279
16.6.1 阻塞 279
16.6.2 死锁 280
16.6.3 死锁的预防 280
16.6.4 死锁检测与解除 281
16.6.5 活锁 282
16.7 CXDB加锁的实现 282
16.7.1 CXDB加锁的粒度 282
16.7.2 CXDB表级锁的类型 283
16.7.3 CXDB的死锁检测与解决 285
实验 死锁 285
习题16 287
第17章 故障恢复 289
17.1 故障恢复概述 289
17.1.1 故障类型 289
17.1.2 故障恢复基础 290
17.2 Undo日志 292
17.2.1 日志的概念 292
17.2.2 日志记录 293
17.2.3 使用Undo日志的恢复 294
17.2.4 检查点 295
17.2.5 模糊检查点 296
17.3 Redo日志 297
17.3.1 使用Redo日志的恢复 297
17.3.2 Redo日志的检查点 298
17.3.3 使用带检查点的Redo日志的恢复 299
17.4 Undo/Redo日志 299
17.4.1 使用Undo/Redo日志的恢复 299
17.4.2 Undo/Redo日志的检查点 300
17.5 防备介质故障 301
17.5.1 备份类型 301
17.5.2 使用备份和日志的恢复 302
习题17 302
第18章 数据库技术的发展 305
18.1 数据仓库 306
18.1.1 数据仓库的发展与定义 306
18.1.2 数据仓库的特点 307
18.1.3 数据仓库的组成 308
18.1.4 新一代数据仓库 309
18.2 XML和XQuery 310
18.2.1 半结构化数据 311
18.2.2 XML 311
18.2.3 XPath 313
18.2.4 XQuery 314
附录A 人员数据库设计 319
A.1 表定义和表数据 319
A.2 创建语句 321
附录B 图书借阅数据库设计 323
B.1 规章制度 323
B.2 与藏书有关的需求 324
B.3 数据库设计 325
参考文献 333