第三章 数据库系统知识 - 数据库基础到关系代数 ⭐⭐⭐
学习提示 :本章是系统架构师考试的核心章节,选择题每年3-5分,案例分析题必考一道选做题。重点掌握:三级模式两级映像、ER图转关系模型、关系代数运算及转换。
📚 本章内容导览
数据库系统知识 ⭐⭐⭐
- 数据库基本概念 2. 数据库设计 3. 数据模型 4. 关系代数 三级模式两级映像 ⭐⭐⭐
数据库系统组成
六个设计阶段 ⭐⭐
ER图合并冲突
ER模型 ⭐⭐⭐
关系模型 ⭐⭐⭐
ER图→关系模型转换 ⭐⭐⭐
基本运算:并交差
扩展运算 ⭐⭐⭐
笛卡尔积↔自然连接转换 ⭐⭐⭐
重点标注:
- ⭐ 基础了解(偶尔考察)
- ⭐⭐ 重要考点(需要理解掌握)
- ⭐⭐⭐ 核心考点(必考内容,需熟练掌握)
考试分值:
- 选择题:3-5分
- 案例分析:一道选做题(约25分)
1. 数据库基本概念
1.1 核心概念对比
📦 数据库(Database, DB)
官方定义:数据的集合,将大量数据存储在一起形成的"数据仓库"。
通俗理解:就像一个大型图书馆,存放着各种各样的数据。
🖥️ 数据库系统(Database System, DBS)
官方定义 :能够存储和使用数据的完整的计算机系统(宏观概念)。
组成结构:
数据库系统 (DBS)
├── 数据库(DB) - 数据本身
├── 硬件 - 服务器、存储设备等
├── 软件 - 操作系统、DBMS等
└── 人员 - DBA、开发人员、用户等
通俗理解:不仅包括数据本身,还包括运行数据库所需的全套系统(硬件+软件+人员)。
⚙️ 数据库管理系统(Database Management System, DBMS)
官方定义 :用来管理数据库的软件系统。
核心功能:
- 数据定义:定义数据结构(建表、建库)
- 数据操作:增删改查(CRUD)
- 数据运行管理:并发控制、安全管理、完整性约束
- 数据维护:备份、恢复、性能优化
常见DBMS:MySQL、Oracle、SQL Server、PostgreSQL等
通俗理解:DBMS就像图书馆的管理系统,负责管理图书的分类、借阅、归还等。
1.2 三级模式两级映像 ⭐⭐⭐(高频必考)
考试重点:几乎每年必考,务必掌握!
三级模式结构图
┌─────────────────────────────────────────────┐
│ 用户A 用户B 用户C │
│ ↓ ↓ ↓ │
│ ┌─────────┬─────────┬─────────┐ │
│ │ 外模式1 │ 外模式2 │ 外模式3 │ │ ← 视图层(View Layer)
│ │ (视图) │ (视图) │ (视图) │ │ 多个外模式
│ └────┬────┴────┬────┴────┬────┘ │
│ └─────────┼─────────┘ │
│ ↓ │
│ 外模式/模式映像 │ ← 逻辑独立性
│ ↓ │
│ ┌──────────────────┐ │
│ │ 概念模式(模式) │ │ ← 逻辑层(Logical Layer)
│ │ (基本表) │ │ 唯一的概念模式
│ └─────────┬────────┘ │
│ ↓ │
│ 模式/内模式映像 │ ← 物理独立性
│ ↓ │
│ ┌──────────────────┐ │
│ │ 内模式 │ │ ← 物理层(Physical Layer)
│ │ (物理存储文件) │ │ 唯一的内模式
│ └─────────┬────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ 物理存储 │ │
│ └──────────┘ │
└─────────────────────────────────────────────┘
三级模式详解
1️⃣ 外模式(External Schema)
- 别名:子模式、用户模式
- 对应 :视图(View)
- 特点 :
- 有多个外模式
- 虚拟表,不存储实际数据
- 只读,不能修改
- 向不同用户展示不同的数据视图
举例:
sql
-- 学生只能看到自己的成绩
CREATE VIEW 学生成绩视图 AS
SELECT 学号, 姓名, 课程名, 成绩
FROM 成绩表
WHERE 学号 = 当前用户学号;
-- 教师可以看到所有学生成绩
CREATE VIEW 教师成绩视图 AS
SELECT * FROM 成绩表;
通俗理解:就像不同的用户看到不同的"数据窗口",每个人看到的内容可能不一样。
2️⃣ 概念模式(Conceptual Schema)
- 别名:模式、逻辑模式
- 对应 :基本表(Table)
- 特点 :
- 只有一个概念模式
- 存储实际数据
- 可以增删改查
- 反映数据的逻辑结构
举例:
sql
-- 学生表(基本表)
CREATE TABLE 学生表 (
学号 VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
专业 VARCHAR(50)
);
通俗理解:就是我们平时说的"表",如学生表、课程表、成绩表等。
3️⃣ 内模式(Internal Schema)
- 别名:存储模式、物理模式
- 对应 :物理存储文件
- 特点 :
- 只有一个内模式
- 描述数据在硬盘上的存储方式
- 涉及索引、存储结构等
存储方式:
- 顺序存储
- 链式存储
- 索引存储(B树、B+树)
通俗理解:数据在硬盘上实际是怎么存储的(如.db文件、.mdf文件等)。
两级映像详解
映像1:外模式/模式映像 → 逻辑独立性
作用 :保证应用程序和数据库可以独立修改
问题场景:
应用程序中写了SQL:SELECT SNO, SNAME FROM 学生表;
如果数据库中把 SNO 改成 StudentNo,应用程序就报错了!
解决方案:
┌─────────────────────────────────────────┐
│ 应用程序 │
│ SELECT SNO, SNAME FROM 学生视图; │ ← 固定不变
└─────────────┬───────────────────────────┘
│
↓
【外模式/模式映像】
↓
┌─────────────┴───────────────────────────┐
│ 数据库 │
│ CREATE VIEW 学生视图 AS │
│ SELECT StudentNo AS SNO, │ ← 只需修改映像
│ StudentName AS SNAME │
│ FROM 学生表; │
└─────────────────────────────────────────┘
好处:
- 数据库的列名改了,只需修改视图定义(映像)
- 应用程序代码完全不用改
- 实现了逻辑独立性
映像2:模式/内模式映像 → 物理独立性
作用 :保证物理存储方式和逻辑结构可以独立修改
举例:
- 改变存储方式(从顺序存储改为索引存储)
- 改变存储位置(从磁盘A迁移到磁盘B)
- 添加索引、分区等
这些物理层面的修改,不会影响上层的表结构和应用程序。
三层架构总结表
| 层次 | 模式名称 | 对应内容 | 数量 | 主要作用 |
|---|---|---|---|---|
| 视图层 | 外模式 | 视图(View) | 多个 | 向用户展示数据 |
| 逻辑层 | 概念模式 | 基本表(Table) | 1个 | 定义数据逻辑结构 |
| 物理层 | 内模式 | 物理文件(File) | 1个 | 定义物理存储方式 |
| 映像关系 | 保证的特性 | 作用 |
|---|---|---|
| 外模式/模式映像 | 逻辑独立性 | 应用程序与数据库可独立修改 |
| 模式/内模式映像 | 物理独立性 | 逻辑结构与物理存储可独立修改 |
记忆口诀:外概内,视表文;外概逻辑独立,概内物理独立
2. 数据库设计 ⭐⭐
2.1 数据库设计的六个阶段
数据库设计流程
│
├─→ ① 需求分析 ────────────→ 产出:数据流图、数据字典、需求说明书
│
├─→ ② 概念结构设计 ────────→ 产出:ER图(概念模型)
│
├─→ ③ 逻辑结构设计 ────────→ 产出:关系模式(表结构)
│
├─→ ④ 物理设计 ────────────→ 产出:存储结构、索引方案
│
├─→ ⑤ 实施 ────────────────→ 产出:运行的数据库
│
└─→ ⑥ 运行和维护 ──────────→ 持续优化和维护
2.2 各阶段详解
阶段1:需求分析
目标:搞清楚数据存储和使用的需求
三大要求:
- 📋 信息要求:需要存储哪些数据?数据的属性有哪些?
- ⚙️ 处理要求:需要做哪些操作?数据如何处理?
- 🖥️ 系统要求:性能、安全性、可靠性要求
产出物:
- 数据流图(DFD)
- 数据字典(DD)
- 需求说明书
阶段2:概念结构设计 ⭐⭐⭐
目标:从用户角度设计系统的概念结构
产出物 :ER图(Entity-Relationship Diagram,实体联系图)
设计步骤:
① 选择局部应用(按功能模块)
↓
② 设计局部ER图(每个模块一个ER图)
↓
③ 合并ER图 → 形成全局ER图
ER图合并时的三种冲突 ⭐⭐
1️⃣ 属性冲突
定义 :同一属性在不同ER图中的取值范围不同
举例:
ER图A:年龄的取值范围是 18-25
ER图B:年龄的取值范围是 20-25
冲突!同一批学生,年龄范围应该一致
2️⃣ 命名冲突
分为两种情况:
-
同名不同义:名字相同,含义不同
ER图A:学号 → 存储学号 ER图B:学号 → 存储身份证号 -
同义不同名:含义相同,名字不同
ER图A:学号(SNO) ER图B:学生编号(StudentID)
3️⃣ 结构冲突
定义 :同一实体在不同ER图中属性数量不同
举例:
ER图A:学生实体有3个属性(学号、姓名、年龄)
ER图B:学生实体有5个属性(学号、姓名、年龄、性别、专业)
冲突!同一实体,属性应该统一
记忆口诀:属性值、命名、结构
阶段3:逻辑结构设计 ⭐⭐⭐
目标 :将ER图转换为关系模型(二维表)
设计步骤:
① 确定数据模型(关系型、网状、层次等)
↓
② 将ER图转换为数据模型
↓
③ 确定完整性约束、用户视图
转换规则:详见下文"数据模型"章节
阶段4:物理设计
目标:确定数据在物理磁盘上的存储方式
设计内容:
- 数据分布(单机 or 分布式)
- 存储结构(顺序、链式、索引)
- 访问方式(B+树索引、哈希索引)
阶段5:实施
目标:根据设计结果,创建数据库并导入数据
主要工作:
- 创建数据库
- 创建表结构
- 建立约束(主键、外键、唯一约束等)
- 导入数据
阶段6:运行和维护
目标:数据库上线运行,持续优化和维护
主要工作:
- 监控性能
- 备份恢复
- 问题修复
- 性能优化
2.3 设计阶段总结表
| 阶段 | 主要工作 | 产出物 | 重要性 |
|---|---|---|---|
| ① 需求分析 | 收集用户需求 | 数据流图、数据字典、需求说明书 | ⭐⭐ |
| ② 概念结构设计 | 设计ER图 | ER图(概念模型) | ⭐⭐⭐ |
| ③ 逻辑结构设计 | ER图→表 | 关系模式(表结构) | ⭐⭐⭐ |
| ④ 物理设计 | 设计存储方案 | 存储结构、索引方案 | ⭐⭐ |
| ⑤ 实施 | 建库建表导数据 | 运行的数据库 | ⭐ |
| ⑥ 运行维护 | 监控优化 | - | ⭐ |
3. 数据模型 ⭐⭐⭐
3.1 数据模型概述
数据模型的分类
数据模型
│
├── 概念模型 ────→ ER模型(实体联系模型)
│
└── 逻辑模型
├── 关系模型 ──→ 二维表(最常用)⭐⭐⭐
├── 层次模型 ──→ 树形结构
├── 网状模型 ──→ 图形结构
└── 面向对象模型 ─→ ORM
3.2 数据模型的三要素 ⭐
考点:选择题常考"以下哪个不是数据模型三要素"
| 要素 | 说明 | 关系模型举例 |
|---|---|---|
| 数据结构 | 研究对象类型的集合 | 二维表(Table) |
| 数据操作 | 允许的操作集合 | SQL语言(增删改查) |
| 数据约束 | 完整性约束条件 | 主键约束、外键约束、唯一约束 |
记忆口诀:结构、操作、约束
4. ER模型(概念模型)⭐⭐⭐
4.1 ER图的三大要素
ER图组成
│
├── 实体(Entity) ──→ 矩形表示
├── 联系(Relationship)──→ 菱形表示
└── 属性(Attribute) ──→ 椭圆表示
4.2 实体(Entity)
实体的表示
基本实体:用矩形表示
┌──────────┐
│ 学生 │ ← 普通实体
└──────────┘
子实体:矩形内有两条横杠
┌──────────┐
│ 经理 │ ← 子实体(员工的一个子类)
│══════════│
└──────────┘
弱实体:双层矩形
┌─┌────────┐─┐
│ │紧急联系人│ │ ← 弱实体(依赖员工存在)
└─└────────┘─┘
实体的类型
1. 普通实体(强实体)
- 定义:独立存在的实体
- 举例:学生、教师、课程、部门
2. 子实体
-
定义:某个实体的子类(分类)
-
举例:
员工(父实体) ├── 经理(子实体) ├── 部门经理(子实体) └── 业务员(子实体) -
特点:
- 子实体继承父实体的所有属性
- 子实体通常不单独建表
- 通常在父实体表中增加"类型"字段区分
-
建表方式:
sql-- 不建经理表、业务员表,只建员工表 CREATE TABLE 员工表 ( 员工号 VARCHAR(20), 姓名 VARCHAR(50), 岗位 VARCHAR(20), -- 标识是经理、部门经理还是业务员 ... );
3. 弱实体
-
定义:依赖其他实体存在而存在的实体
-
判断标准:如果A不存在,就不会记录B,则B是弱实体
-
举例:
员工(强实体) ←─── 紧急联系人(弱实体) 如果公司没有这个员工,就不会记录他的紧急联系人 -
其他例子:
- 订单(强实体)←─── 订单明细(弱实体)
- 课程(强实体)←─── 课程章节(弱实体)
4.3 属性(Attribute)
属性的分类
1. 简单属性 vs 复合属性
-
简单属性:不可再分的属性
- 举例:年龄、性别
-
复合属性:可以拆分的属性
- 举例:地址 = 国家 + 省 + 市 + 区 + 街道 + 门牌号
2. 单值属性 vs 多值属性
-
单值属性:只有一个值
- 举例:学号、姓名
-
多值属性:可以有多个值
- 举例:电话号码(可能有多个)
3. 派生属性 ⭐
定义:可以由其他属性计算得出的属性
举例:
年龄 = 当前年份 - 出生年份 ← 派生属性
不需要单独存储,可以动态计算
4. NULL属性
定义:允许为空的属性
举例:家庭住址(可能为空)
码(Key)⭐⭐
定义 :能够唯一标识一个实体的属性
别名:主键、主码、关键字
举例:
- 学生实体:学号、身份证号
- 教师实体:教师工号
- 商品实体:商品编号
4.4 联系(Relationship)
联系的三种类型 ⭐⭐⭐(高频必考)
重要:必须会判断联系类型!
判断方法:双向描述法
【步骤】
1. 从A角度看B:一个A对应几个B?
2. 从B角度看A:一个B对应几个A?
3. 连起来就是联系类型
1. 一对一联系(1:1)
判断过程:
一个超市 只能被 一个经理 管理 → 写1
一个经理 只能管理 一个超市 → 写1
连起来:1:1 联系
ER图表示:
┌────┐ ┌────┐ ┌────┐
│超市│─── 1 ───│管理│─── 1 ───│经理│
└────┘ └────┘ └────┘
2. 一对多联系(1:N)⭐⭐⭐
判断过程:
一个员工 只能属于 一个部门 → 写1
一个部门 可以有 多个员工 → 写N
连起来:员工-部门是 N:1 关系(部门是1,员工是N)
ER图表示:
┌────┐ ┌────┐ ┌────┐
│部门│─── 1 ───│所属│─── N ───│员工│
└────┘ └────┘ └────┘
常见例子:
- 部门-员工(1:N)
- 班级-学生(1:N)
- 客户-订单(1:N)
3. 多对多联系(M:N)⭐⭐⭐
判断过程:
一个学生 可以选修 多门课程 → 写M
一门课程 可以被 多个学生选修 → 写N
连起来:学生-课程是 M:N 关系
ER图表示:
┌────────┐ ┌────┐ ┌────┐
│ 学生 │─── M ───│选修│─── N ───│课程│
└────────┘ └────┘ └────┘
常见例子:
- 学生-课程(M:N)
- 业务员-商品(M:N)
- 作者-书籍(M:N)
联系也可以有属性
举例:配送联系的属性
┌────────┐ ┌────┐
│ 业务员 │───── M:N ────────────│商品│
└────────┘ ↓ └────┘
┌────┐
│配送│ ← 联系
└──┬─┘
│
┌──────┴──────┐
↓ ↓
┌──────┐ ┌──────┐
│订单号│ │配送时间│ ← 联系的属性
└──────┘ └──────┘
5. 关系模型(逻辑模型)⭐⭐⭐
5.1 关系模型的基本概念
什么是关系模型?
定义 :用二维表来表示实体和联系的数据模型
通俗理解:就是我们常说的"表",有行和列
关系模型的基本术语
列1 列2 列3
学号 姓名 年龄 ← 属性(Attribute)
┌──────┬──────┬──────┐
行1 │ 001 │ 张三 │ 20 │ ← 元组/记录(Tuple)
├──────┼──────┼──────┤
行2 │ 002 │ 李四 │ 21 │
├──────┼──────┼──────┤
行3 │ 003 │ 王五 │ 22 │
└──────┴──────┴──────┘
↑
关系/表(Relation)
| 术语 | 说明 | 通俗名称 |
|---|---|---|
| 关系(Relation) | 一个二维表 | 表 |
| 元组(Tuple) | 表中的一行 | 行、记录 |
| 属性(Attribute) | 表中的一列 | 列、字段 |
| 域(Domain) | 属性的取值范围 | - |
| 码(Key) | 唯一标识元组的属性 | 主键 |
5.2 ER图 → 关系模型的转换 ⭐⭐⭐(高频必考)
重要转换规则,必须掌握!
转换规则总览
ER图转换规则
│
├── 实体的转换 ──→ 每个实体转为一个关系(表)
│ 实体的属性转为关系的属性(列)
│
└── 联系的转换
├── 1:1联系 ──→ 可放在任意一端(不常考)
├── 1:N联系 ──→ 在N端加入1端的码 ⭐⭐⭐
└── M:N联系 ──→ 单独建表,包含两端的码 ⭐⭐⭐
规则1:实体 → 关系表
规则:每个实体转为一个关系(表),实体的属性转为表的列
举例:
ER图实体:
┌────────────┐
│ 学生 │
├────────────┤
│ 学号 │ ← 属性
│ 姓名 │
│ 年龄 │
│ 专业 │
└────────────┘
转换为关系表:
sql
CREATE TABLE 学生表 (
学号 VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
专业 VARCHAR(50)
);
规则2:1:1联系的转换
规则:可以放在任意一端作为属性,或单独建表
方式1:放在超市表
sql
CREATE TABLE 超市表 (
超市编号 VARCHAR(20) PRIMARY KEY,
超市名称 VARCHAR(50),
经理工号 VARCHAR(20) -- 经理的码
);
方式2:放在经理表
sql
CREATE TABLE 经理表 (
经理工号 VARCHAR(20) PRIMARY KEY,
经理姓名 VARCHAR(50),
超市编号 VARCHAR(20) -- 超市的码
);
注意:1:1联系考试较少,因为放哪边都行
规则3:1:N联系的转换 ⭐⭐⭐(高频必考)
规则 :在N端 加入1端的码(作为外键)
重要:必须记住是在N端加!
举例:部门-员工(1:N)
错误做法:在1端(部门)加入N端(员工)的码
sql
-- ❌ 错误!会导致大量冗余
CREATE TABLE 部门表 (
部门编号 VARCHAR(20),
部门名称 VARCHAR(50),
员工工号 VARCHAR(20) -- 错误!如果部门有100个员工,就要100条重复记录
);
正确做法:在N端(员工)加入1端(部门)的码
sql
-- 部门表
CREATE TABLE 部门表 (
部门编号 VARCHAR(20) PRIMARY KEY,
部门名称 VARCHAR(50)
);
-- 员工表(在这里加部门编号)
CREATE TABLE 员工表 (
员工工号 VARCHAR(20) PRIMARY KEY,
员工姓名 VARCHAR(50),
部门编号 VARCHAR(20), -- ✓ 正确!加入部门的码
FOREIGN KEY (部门编号) REFERENCES 部门表(部门编号)
);
记忆方法:"多"的一方记录"一"的编号,就像学生记住班级编号
规则4:M:N联系的转换 ⭐⭐⭐(高频必考)
规则 :M:N联系必须单独建表 ,表的码是两端的联合码
举例:学生-课程(M:N,选课关系)
sql
-- 学生表
CREATE TABLE 学生表 (
学号 VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(50)
);
-- 课程表
CREATE TABLE 课程表 (
课程号 VARCHAR(20) PRIMARY KEY,
课程名 VARCHAR(50)
);
-- 选课表(M:N联系必须单独建表)
CREATE TABLE 选课表 (
学号 VARCHAR(20),
课程号 VARCHAR(20),
成绩 INT, -- 联系的属性也可以加进来
PRIMARY KEY (学号, 课程号), -- 联合主键
FOREIGN KEY (学号) REFERENCES 学生表(学号),
FOREIGN KEY (课程号) REFERENCES 课程表(课程号)
);
要点:
- M:N联系一定要单独建表
- 新表的主键是两端码的组合(联合主键)
- 联系的属性(如成绩)也放入这个新表
5.3 转换规则总结表
| 联系类型 | 转换方法 | 举例 | 考试频率 |
|---|---|---|---|
| 1:1 | 放任意一端或单独建表 | 超市-经理 | ⭐ |
| 1:N | 在N端加1端的码 | 部门-员工 | ⭐⭐⭐ |
| M:N | 单独建表,联合码 | 学生-课程 | ⭐⭐⭐ |
记忆口诀:N端加一端,多对多单建
6. 关系代数 ⭐⭐⭐(高频必考)
考试重点:每年必考,且考查方式灵活!
6.1 关系代数概述
定义:关系(表)之间的运算
运算单位:关系(表)
运算结果:仍然是关系(表)
6.2 基本运算:并、交、差
前提条件 :两个关系的属性结构必须完全相同(列数相同、对应列的数据类型相同)
6.2.1 并(Union)∪
符号:∪
定义 :把两个关系的所有元组合并,重复的只保留一次
示例:
关系S1:
┌────┬──────┬────┐
│ NO │ Name │ Age│
├────┼──────┼────┤
│ 01 │ 张三 │ 20 │
│ 02 │ 李四 │ 21 │
│ 03 │ 王五 │ 22 │
└────┴──────┴────┘
关系S2:
┌────┬──────┬────┐
│ NO │ Name │ Age│
├────┼──────┼────┤
│ 01 │ 张三 │ 20 │ ← 与S1第一行重复
│ 04 │ 赵六 │ 23 │
│ 05 │ 孙七 │ 24 │
└────┴──────┴────┘
S1 ∪ S2 结果:
┌────┬──────┬────┐
│ NO │ Name │ Age│
├────┼──────┼────┤
│ 01 │ 张三 │ 20 │ ← 重复的只显示一次
│ 02 │ 李四 │ 21 │
│ 03 │ 王五 │ 22 │
│ 04 │ 赵六 │ 23 │
│ 05 │ 孙七 │ 24 │
└────┴──────┴────┘
特点:
- 先显示第一张表的所有行
- 再显示第二张表中不重复的行
6.2.2 交(Intersection)∩
符号:∩
定义 :只保留两个关系共有的元组
S1 ∩ S2 结果:
┌────┬──────┬────┐
│ NO │ Name │ Age│
├────┼──────┼────┤
│ 01 │ 张三 │ 20 │ ← 只保留两表都有的行
└────┴──────┴────┘
6.2.3 差(Difference)−
符号:− 或 -
定义 :从第一个关系中去掉与第二个关系相同的元组
公式:S1 − S2 = S1中有但S2中没有的元组
S1 − S2 结果:
┌────┬──────┬────┐
│ NO │ Name │ Age│
├────┼──────┼────┤
│ 02 │ 李四 │ 21 │ ← S1中有但S2中没有的
│ 03 │ 王五 │ 22 │
└────┴──────┴────┘
注意:差运算不满足交换律
- S1 − S2 ≠ S2 − S1
6.3 扩展运算 ⭐⭐⭐(高频必考)
考试重点:笛卡尔积、投影、选择、自然连接及其相互转换
6.3.1 笛卡尔积(Cartesian Product)×
符号:× (乘号,考试时不要写成 * )
定义 :两个关系的乘积运算
结果规律:
- 列数 = 两表列数之和(重复列也显示)
- 行数 = 两表行数之积
示例:
关系R(2行3列)× 关系S(3行3列)= 结果(6行6列)
┌──────┬──────┬──────┬──────┬──────┬──────┐
│ R.A │ R.B │ R.C │ S.A │ S.C │ S.D │ ← 列:3+3=6列
├──────┼──────┼──────┼──────┼──────┼──────┤
│ a1 │ b1 │ c1 │ a1 │ c1 │ d1 │ ← R第1行 × S第1行
│ a1 │ b1 │ c1 │ a2 │ c2 │ d2 │ ← R第1行 × S第2行
│ a1 │ b1 │ c1 │ a3 │ c3 │ d3 │ ← R第1行 × S第3行
│ a2 │ b2 │ c2 │ a1 │ c1 │ d1 │ ← R第2行 × S第1行
│ a2 │ b2 │ c2 │ a2 │ c2 │ d2 │ ← R第2行 × S第2行
│ a2 │ b2 │ c2 │ a3 │ c3 │ d3 │ ← R第2行 × S第3行
└──────┴──────┴──────┴──────┴──────┴──────┘
← 行:2×3=6行
规律:用第一张表的每一行,依次与第二张表的每一行连接
6.3.2 投影(Projection)π
符号:π(希腊字母派)
定义 :按条件选择某几列
语法 :π列号或列名(关系名)
示例:
关系S1:
┌────┬──────┬────┐
│ SNO│ Name │ Age│ ← 列编号: 1 2 3
├────┼──────┼────┤
│ 01 │ 张三 │ 20 │
│ 02 │ 李四 │ 21 │
│ 03 │ 王五 │ 22 │
└────┴──────┴────┘
投影运算:π₁,₂(S1) 或 π_{SNO,Name}(S1)
结果:
┌────┬──────┐
│ SNO│ Name │ ← 只保留第1、2列
├────┼──────┤
│ 01 │ 张三 │
│ 02 │ 李四 │
│ 03 │ 王五 │
└────┴──────┘
6.3.3 选择(Selection)σ
符号:σ(希腊字母西格玛)
定义 :按条件选择某几行
语法 :σ条件(关系名)
示例:
选择运算:σ_{SNO='03'}(S1) 或 σ_{1='03'}(S1)
结果:
┌────┬──────┬────┐
│ SNO│ Name │ Age│
├────┼──────┼────┤
│ 03 │ 王五 │ 22 │ ← 只保留SNO='03'的行
└────┴──────┴────┘
注意:
- 纯数字不加引号:
σ_{Age>20}(S1) - 包含字符必须加单引号:
σ_{SNO='03'}(S1)
6.3.4 自然连接(Natural Join)⋈
符号:⋈(两个三角形)
定义 :根据公共列连接两个关系
结果规律:
- 列 :两表列数之和,重复列只显示一次
- 行:公共列的值相同的行才连接
示例:
关系R:
┌────┬──────┬────┐
│ A │ B │ C │
├────┼──────┼────┤
│ a1 │ b1 │ c1 │
│ a2 │ b2 │ c2 │
│ a3 │ b3 │ c3 │
└────┴──────┴────┘
关系S:
┌────┬──────┬────┐
│ A │ C │ D │
├────┼──────┼────┤
│ a1 │ c1 │ d1 │ ← A=a1, C=c1 与R第1行匹配
│ a2 │ c2 │ d2 │ ← A=a2, C=c2 与R第2行匹配
│ a4 │ c4 │ d4 │ ← A=a4 在R中不存在,不匹配
└────┴──────┴────┘
R ⋈ S 结果:
┌────┬──────┬────┬────┐
│ A │ B │ C │ D │ ← 列:A、B、C、D(重复的A、C只显示一次)
├────┼──────┼────┼────┤
│ a1 │ b1 │ c1 │ d1 │ ← R第1行与S第1行匹配(A=a1且C=c1)
│ a2 │ b2 │ c2 │ d2 │ ← R第2行与S第2行匹配(A=a2且C=c2)
└────┴──────┴────┴────┘
连接条件 :公共列A和C的值必须同时相同(R.A=S.A 且 R.C=S.C)
6.4 关系代数的转换 ⭐⭐⭐(高频必考)
考试重点:笛卡尔积 ↔ 自然连接的转换
转换原理
核心思想:用投影和选择,从笛卡尔积中"筛选"出自然连接的结果
公式:
R ⋈ S = π_{列}(σ_{条件}(R × S))
步骤:
- 先做笛卡尔积(R × S)
- 用选择(σ)筛选出公共列值相同的行
- 用投影(π)去掉重复的列
转换示例
目标 :将 R ⋈ S 转换为笛卡尔积表达式
Step 1:笛卡尔积 R × S 有6列
列编号: 1 2 3 4 5 6
列名: R.A R.B R.C S.A S.C S.D
Step 2:投影 - 去掉重复列
- 自然连接的列是:A、B、C、D
- 保留:列1(R.A)、列2(R.B)、列3(R.C)、列6(S.D)
- 去掉:列4(S.A)、列5(S.C)
- 投影:
π₁₂₃₆(...)
Step 3:选择 - 筛选公共列值相同的行
- 公共列是A和C
- 条件:列1=列4(R.A=S.A)且 列3=列5(R.C=S.C)
- 选择:
σ_{1=4 ∧ 3=5}(...)
最终表达式:
R ⋈ S = π₁₂₃₆(σ_{1=4 ∧ 3=5}(R × S))
6.5 关系代数符号总结
| 运算 | 符号 | 说明 |
|---|---|---|
| 并 | ∪ | Union |
| 交 | ∩ | Intersection |
| 差 | − | Difference |
| 笛卡尔积 | × | Cartesian Product(不是*) |
| 投影 | π | Pi,选择列 |
| 选择 | σ | Sigma,选择行 |
| 自然连接 | ⋈ | Natural Join,两个三角形 |
| 且 | ∧ | AND |
| 或 | ∨ | OR |
记忆口诀:π投σ选×笛⋈连
6.6 关系代数考试技巧
-
看符号识别运算:考试直接给符号,不给中文
-
转换题看清方向:
- 自然连接 → 笛卡尔积:加投影+选择
- 笛卡尔积 → 自然连接:去投影+选择
-
画图辅助:复杂运算可以画韦恩图辅助理解
-
注意引号:
- 纯数字不加引号
- 包含字符加单引号
-
列号从1开始:数据库中列编号默认从1开始(不是0)
💡 本章学习要点
学习重点
⭐⭐⭐ 必须掌握(必考内容):
- 三级模式两级映像(逻辑独立性、物理独立性)
- ER图合并的三种冲突
- 联系类型的判断(1:1、1:N、M:N)
- ER图→关系模型的转换规则(尤其1:N和M:N)
- 关系代数的扩展运算(投影、选择、自然连接)
- 笛卡尔积↔自然连接的转换
⭐⭐ 重点理解(高频考点):
- 数据库设计的六个阶段及产出物
- 实体的三种类型(普通、子实体、弱实体)
- 属性的分类(派生属性)
- 关系代数的基本运算(并、交、差)
⭐ 了解层面(偶尔考到):
- 数据模型的三要素
- 数据库系统的组成
记忆技巧
- 三级模式:外概内,视表文
- 两级映像:外概逻辑独立,概内物理独立
- ER合并冲突:属性值、命名、结构
- 联系转换:N端加一端,多对多单建
- 关系代数符号:π投σ选×笛⋈连
- 转换公式:自然连接 = 投影(选择(笛卡尔积))
✅ 自测题
选择题
1. 在数据库的三级模式中,描述记录之间的联系、操作数据的完整性和安全性等要求的是( )模式,表示用户使用的部分数据的是( )模式。
A. 用户模式
B. 外模式
C. 概念模式
D. 内模式
点击查看答案
答案:C、B
解析:
- 第一空:记录联系、完整性、安全性 → 逻辑结构 → 概念模式
- 第二空:用户使用的部分数据 → 视图 → 外模式
2. 在数据库逻辑结构设计阶段,需要( )阶段形成的( )作为设计依据。
A. 需求分析;数据流图和数据字典
B. 需求分析;数据字典和数据项
C. 概念结构设计;概念模型
D. 概念结构设计;ER模型
点击查看答案
答案:A
解析:
- 逻辑结构设计的前序阶段有:需求分析、概念结构设计
- 需求分析产出:数据流图、数据字典
- 概念结构设计产出:ER图(概念模型)
- 因为第二空没有ER图,所以只能选A
3. 给定关系R(A,B,C,D)和S(A,C,E,F),以下( )与 R ⋈ S 等价。
A. R × S
B. σ_{R.B>S.E}(R × S)
C. π₁₂₃₄₇₈(σ_{1=5 ∧ 3=6}(R × S))
D. π₁₂₃₄₇₈(R × S)
点击查看答案
答案:C
解析:
- R × S 列编号:1-R.A, 2-R.B, 3-R.C, 4-R.D, 5-S.A, 6-S.C, 7-S.E, 8-S.F
- 自然连接需要:
- 去掉重复列(保留1,2,3,4,7,8)
- 公共列值相同(1=5且3=6)
- 完整表达式:
π₁₂₃₄₇₈(σ_{1=5 ∧ 3=6}(R × S))
4. 在数据库的关系运算中,R ∩ S 可以用下列( )表达式来代替。
A. R − (R − S)
B. S − (R − S)
C. (R ∪ S) − (R − S)
D. (R ∪ S) − S
点击查看答案
答案:A
解析(画图法):
R S
┌─┐ ┌─┐
│ │◯◯◯◯◯◯│ │
│ │███████│ │ ← R ∩ S
│ │◯◯◯◯◯◯│ │
└─┘ └─┘
R − S:左边不重叠部分R − (R − S):R去掉左边不重叠部分 = 重叠部分 = R ∩ S ✓
简答题
1. 请说明外模式/模式映像的作用,并举例说明如何实现逻辑独立性。
点击查看答案
作用:保证逻辑独立性,使应用程序和数据库可以独立修改。
举例:
场景 :应用程序中有SQL语句 SELECT SNO, SNAME FROM 学生表;
问题:如果数据库把列名SNO改为StudentNo,应用程序就会报错。
解决方案:使用外模式/模式映像
sql
-- 创建视图(映像)
CREATE VIEW 学生视图 AS
SELECT StudentNo AS SNO, -- 映像关系
StudentName AS SNAME
FROM 学生表;
-- 应用程序使用视图
SELECT SNO, SNAME FROM 学生视图; -- 固定不变
效果:
- 数据库列名改变时,只需修改视图定义
- 应用程序代码不需要修改
- 实现了逻辑独立性
2. 请说明一对多(1:N)联系转换为关系模型的规则,并举例说明为什么不能在1端加入N端的码。
点击查看答案
转换规则 :在N端 加入1端的码(作为外键)
举例:部门-员工(1:N)
错误做法:在1端加入N端的码
sql
CREATE TABLE 部门表 (
部门编号 VARCHAR(20),
部门名称 VARCHAR(50),
员工工号 VARCHAR(20) -- ❌ 错误
);
问题分析:
- 如果部门有100个员工,需要100条部门记录
- 这100条记录中,只有员工工号不同,其他都相同
- 造成大量数据冗余
正确做法:在N端加入1端的码
sql
CREATE TABLE 员工表 (
员工工号 VARCHAR(20) PRIMARY KEY,
员工姓名 VARCHAR(50),
部门编号 VARCHAR(20), -- ✓ 正确
FOREIGN KEY (部门编号) REFERENCES 部门表(部门编号)
);
优势:
- 每个员工只有一条记录
- 通过部门编号关联到部门表
- 无数据冗余
📝 本章总结
本章作为数据库系统的核心基础章节,主要介绍了:
- 数据库基本概念:三级模式两级映像(⭐⭐⭐核心)
- 数据库设计:六个阶段、ER图合并冲突
- ER模型:实体、联系、属性的表示和分类
- 关系模型:ER图→关系模型的转换规则(⭐⭐⭐核心)
- 关系代数:基本运算和扩展运算、转换技巧(⭐⭐⭐核心)
考试分值:选择题3-5分,案例分析题25分左右
重点掌握:
- 三级模式两级映像
- 联系类型判断和转换(1:N在N端加码,M:N单独建表)
- 关系代数转换(笛卡尔积↔自然连接)
学习建议:
- 理解为主,不要死记硬背
- 多画ER图和关系模型,加深理解
- 做历年真题,掌握出题套路