【系统架构师】第三章 数据库系统知识 - 数据库基础到关系代数(详细版)

第三章 数据库系统知识 - 数据库基础到关系代数 ⭐⭐⭐

学习提示 :本章是系统架构师考试的核心章节,选择题每年3-5分,案例分析题必考一道选做题。重点掌握:三级模式两级映像、ER图转关系模型、关系代数运算及转换。


📚 本章内容导览

数据库系统知识 ⭐⭐⭐

  1. 数据库基本概念 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:需求分析

目标:搞清楚数据存储和使用的需求

三大要求

  • 📋 信息要求:需要存储哪些数据?数据的属性有哪些?
  • ⚙️ 处理要求:需要做哪些操作?数据如何处理?
  • 🖥️ 系统要求:性能、安全性、可靠性要求

产出物

  1. 数据流图(DFD)
  2. 数据字典(DD)
  3. 需求说明书

阶段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))

步骤

  1. 先做笛卡尔积(R × S)
  2. 用选择(σ)筛选出公共列值相同的行
  3. 用投影(π)去掉重复的列

转换示例

目标 :将 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. 看符号识别运算:考试直接给符号,不给中文

  2. 转换题看清方向

    • 自然连接 → 笛卡尔积:加投影+选择
    • 笛卡尔积 → 自然连接:去投影+选择
  3. 画图辅助:复杂运算可以画韦恩图辅助理解

  4. 注意引号

    • 纯数字不加引号
    • 包含字符加单引号
  5. 列号从1开始:数据库中列编号默认从1开始(不是0)


💡 本章学习要点

学习重点

⭐⭐⭐ 必须掌握(必考内容):

  • 三级模式两级映像(逻辑独立性、物理独立性)
  • ER图合并的三种冲突
  • 联系类型的判断(1:1、1:N、M:N)
  • ER图→关系模型的转换规则(尤其1:N和M:N)
  • 关系代数的扩展运算(投影、选择、自然连接)
  • 笛卡尔积↔自然连接的转换

⭐⭐ 重点理解(高频考点):

  • 数据库设计的六个阶段及产出物
  • 实体的三种类型(普通、子实体、弱实体)
  • 属性的分类(派生属性)
  • 关系代数的基本运算(并、交、差)

⭐ 了解层面(偶尔考到):

  • 数据模型的三要素
  • 数据库系统的组成

记忆技巧

  1. 三级模式:外概内,视表文
  2. 两级映像:外概逻辑独立,概内物理独立
  3. ER合并冲突:属性值、命名、结构
  4. 联系转换:N端加一端,多对多单建
  5. 关系代数符号:π投σ选×笛⋈连
  6. 转换公式:自然连接 = 投影(选择(笛卡尔积))

✅ 自测题

选择题

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. 去掉重复列(保留1,2,3,4,7,8)
    2. 公共列值相同(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 部门表(部门编号)
);

优势

  • 每个员工只有一条记录
  • 通过部门编号关联到部门表
  • 无数据冗余

📝 本章总结

本章作为数据库系统的核心基础章节,主要介绍了:

  1. 数据库基本概念:三级模式两级映像(⭐⭐⭐核心)
  2. 数据库设计:六个阶段、ER图合并冲突
  3. ER模型:实体、联系、属性的表示和分类
  4. 关系模型:ER图→关系模型的转换规则(⭐⭐⭐核心)
  5. 关系代数:基本运算和扩展运算、转换技巧(⭐⭐⭐核心)

考试分值:选择题3-5分,案例分析题25分左右

重点掌握

  • 三级模式两级映像
  • 联系类型判断和转换(1:N在N端加码,M:N单独建表)
  • 关系代数转换(笛卡尔积↔自然连接)

学习建议

  • 理解为主,不要死记硬背
  • 多画ER图和关系模型,加深理解
  • 做历年真题,掌握出题套路

相关推荐
亓才孓1 小时前
【MyBatis Plus】Wrapper接口
java·开发语言·数据库·spring boot·mybatis
nudt_qxx2 小时前
Ubuntu 26.04 LTS“坚毅浣熊”(Resolute Raccoon) 新特性前瞻
linux·数据库·ubuntu
tianzhiyi1989sq2 小时前
C++工具库之PugiXML使用指南
java·数据库·c++
人道领域2 小时前
MyBatisPlus高效开发实战指南
java·开发语言·数据库
三水彡彡彡彡2 小时前
深入理解指针:常量、函数与数组
c++·学习
CappuccinoRose2 小时前
HTML语法学习文档(九)
前端·学习·架构·html5
小李独爱秋2 小时前
模拟面试:解释一下数据库的主从复制的原理,或者说:怎么做的数据库的数据同步?
数据库·sql·mysql·面试·职场和发展·职场发展
梵克之泪2 小时前
一次性查找多个文件,批量文件搜索复制高效方案:咕嘎批量文件查找移动存储系统使用指南,告别手动查找
数据库
源码获取_wx:Fegn08952 小时前
计算机毕业设计|基于springboot + vue鲜花销售管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计