数据库期末复习(三)
DBMS的主要作用
DBMS是用户/应用程序与物理数据之间的“中间软件层”,它负责安全、高效、统一地管理数据,并向上层屏蔽底层存储的复杂性。
具体来说,它的核心作用可以总结为以下四大职能:
1. 数据定义与构建(搭架子)
- 负责执行DDL(数据定义语言),建立我们之前讲的三级模式结构(外模式、概念模式、内模式),并定义数据的完整性约束(如主键、外键规则)。
2. 数据操纵与访问(做服务)
- 负责执行DML(数据操作语言),为用户和应用程序提供增、删、改、查(CRUD)接口。它会把我们写的高层SQL语句,翻译成底层文件能理解的读写指令。
3. 数据的控制与管理(保安全)
- 安全性:检查用户权限,防止非法访问(对应外模式的视图隔离)。
- 完整性:保证数据符合规则(比如年龄不能是负数)。
- 并发控制:处理多用户同时访问,避免数据错乱(通过事务和锁机制)。
- 故障恢复:在系统崩溃后,利用日志将数据恢复到一致状态。
4. 实现数据独立性(核心价值)
- 维护两级映射(外/概念映射、概念/内映射)。这正是我们上一题的核心:
- 当DBA改变存储方式(建索引)时,应用程序不用改(物理独立性)。
- 当表结构微调(加字段)时,用户视图可以不变(逻辑独立性)。
关系模型
关系模型是数据库领域的基础概念。它由IBM研究员E.F.Codd在1970年提出,是逻辑数据模型的一种。目前主流的关系数据库(如MySQL、Oracle、SQL Server)都基于此模型。
下面从数据结构、数据操作和完整性约束三个方面来说明关系模型,这也对应了数据模型的三要素。
1. 数据结构:二维表
关系模型的数据结构简单统一,就是二维表格。用户看到的数据和表之间的关系,都以这种逻辑上的二维表形式呈现。
相关术语对照如下:
- 关系(Relation):对应一张二维表。
- 元组(Tuple):对应表中的一行(一条记录)。
- 属性(Attribute):对应表中的一列(一个字段)。
- 域(Domain):属性的取值范围,比如性别的域是{男,女}。
- 分量(Component):元组中的一个属性值,即表格中的一个具体单元格。
关系必须满足的特性:
- 每个分量必须是不可分的数据项(满足第一范式)。
- 表中不允许出现重复的行(元组唯一)。
- 行与列的顺序可以任意交换,不影响逻辑含义。
2. 关系的键(码)
为了唯一标识表中的行,关系模型引入了键(Key)的概念:
- 超键(Super Key):能唯一标识一个元组的属性或属性组合,可能包含多余属性。
- 候选键(Candidate Key):能唯一标识元组且不含多余属性的属性组合。一个关系可能有多个候选键。
- 主键(Primary Key):从候选键中选定一个,作为该表的唯一标识。主键值不能重复,也不能为空。
- 外键(Foreign Key):一个表中的属性,如果它是另一个表的主键,则称为外键。外键用于建立表与表之间的联系。
3. 数据操作:关系代数与关系演算
关系模型的数据操作是日面向集合的,操作对象和结果都是关系(二维表)。用户不需要指定数据的物理存取路径,DBMS会负责优化。
- 关系代数:以集合运算为基础,包含传统的集合运算(并、交、差、笛卡尔积)和专门的关系运算(选择、投影、连接、除)。
- 关系演算:以谓词逻辑为基础,用户只需描述“要什么”,不需要描述“怎么取”。
- SQL语言:SQL是关系数据库的标准语言,它综合了关系代数和关系演算的特点,是用户操作关系数据库的实际工具。
4. 完整性约束
关系模型定义了三类完整性规则,由DBMS自动维护:
- 实体完整性:主键的属性值必须唯一,且不能取空值。
- 参照完整性:外键的值要么为空,要么必须等于被参照表的主键值。
- 用户定义完整性:根据业务需求自定义的约束,例如年龄范围(0-150)、性别只能为男或女等。
5. 关系模型的优缺点
优点:
- 数据结构简单,用户容易理解。
- 数据独立性高,用户无需关心物理存储细节。
- 有坚实的数学理论基础(集合论和逻辑学),便于优化和规范化。
缺点:
- 处理复杂对象或嵌套结构时表达能力有限(例如处理树形结构或图结构时操作不够直观)。
- 对于大规模高并发场景,严格的ACID事务约束可能会限制性能扩展,这也是NoSQL数据库出现的原因之一。
关系代数
关系代数是一种过程化查询语言。它通过一组运算,以一个或多个关系(二维表)作为输入,并输出一个新的关系作为结果。核心特征是封闭性:运算的结果仍然是关系,因此可以嵌套组合,形成复杂查询表达式。
关系代数定义了8种基本运算,可以分成集合运算和专门关系运算两类。
1. 集合运算(基于行)
这类运算来源于数学集合论,要求参与运算的两个关系必须并兼容:它们具有相同的属性个数,且对应属性的数据类型相同。
| 运算 | 符号 | 作用 | 示例(求结果) |
|---|---|---|---|
| 并 | ∪ | 返回属于R或属于S的所有元组(去重) | 选修了数学课或英语课的学生集合 |
| 交 | ∩ | 返回同时属于R和S的元组 | 既选修了数学课又选修了英语课的学生集合 |
| 差 | - | 返回属于R但不属于S的元组 | 只选修了数学课但没选修英语课的学生集合 |
| 笛卡尔积 | × | 将R的每一行与S的每一行进行组合,生成一个更大的关系 | 学生表 × 课程表 = 每个学生与每门课程的排列组合(无实际意义,常配合选择使用) |
2. 专门关系运算(基于行列操作)
这类运算直接针对二维表的行和列进行操作,是查询中最核心的部分。
| 运算 | 符号(希腊字母) | 作用 | 类比SQL |
|---|---|---|---|
| 选择 | σ(Sigma) | 按条件筛选行。从关系中选择满足给定条件的元组。 | WHERE条件子句 |
| 投影 | π(Pi) | 按列筛选。从关系中选择指定的若干属性,并去除重复行。 | SELECT列名 |
| 连接 | ⨝(Join) | 将两个关系根据条件组合成一个新关系。这是笛卡尔积 + 选择条件的组合。 | JOIN ... ON ... |
| 除 | ÷(Division) | 适合处理“查询全部/所有”的问题。例如:查询选修了所有必修课程的学生。 | 通常用NOT EXISTS实现 |
3. 连接运算的进一步细分
连接是关系代数中最常用也最重要的运算,按条件不同分为:
- θ连接(Theta Join):最通用的连接,在笛卡尔积基础上应用一个比较条件(如
R.A > S.B)。 - 等值连接(Equi Join):θ连接的特例,连接条件只能是相等(如
R.id = S.id)。 - 自然连接(Natural Join):等值连接的特例。它自动寻找两个关系中同名的属性,自动做等值连接,并去掉重复的同名列。这是实际中最常用的连接方式。
- 外连接(Outer Join):在自然连接基础上,保留未匹配成功的行(左外、右外、全外)。
4. 重命名运算
- 符号:ρ(Rho)
- 作用:给关系或属性起临时别名。常用于自连接(一个表与自身连接)或嵌套查询中。
5. 关系代数与 SQL 的关系
- 关系代数是SQL语言的理论基础。SQL的
SELECT语句本质上就是关系代数表达式的具体实现。 - 对应关系:
SELECT ... FROM ... WHERE ... GROUP BY ...的底层解析,最终会被数据库优化器转换成关系代数操作树进行优化。 - 过程化特征:关系代数指明了运算的顺序(先做什么、后做什么)。与之相对的是关系演算,它只描述“要什么”而不描述“怎么做”,SQL更接近关系演算,但执行时被转换成关系代数。
6. 示例说明(方便理解)
假设有两个表:学生(学号,姓名)和选课(学号,课程)。
查询:查找选修了“数据库”课程的学生的姓名。
关系代数表达式:
π_姓名( σ_课程='数据库'( 学生 ⨝ 选课 ) )运算步骤:
- 学生 ⨝ 选课:做自然连接,得到“学号-姓名-课程”的完整信息。
- σ_课程=‘数据库’:选择出课程为“数据库”的行。
- π_姓名:只投影出“姓名”这一列。