三级模式与二级映射
第四章:三级模式与二级映射
这是数据库原理的核心概念,理解它才能明白数据库为什么具有"数据独立性"
4.1 三级模式架构概述
4.1.1 为什么需要三级模式
问题:如果用户直接操作物理存储的数据——
- 存储结构改变,程序就要修改
- 不同用户看到不同的数据难以实现
- 安全性难以保证
解决:引入三级抽象,实现数据的独立性
4.1.2 三级模式架构图
4.2 三级模式详解
4.2.1 模式(逻辑模式/概念模式)
| 项目 | 说明 |
|---|---|
| 定义 | 全体数据的逻辑结构和特征的描述 |
| 地位 | 所有用户的公共视图,数据库模式的核心 |
| 数量 | 一个数据库只有一个模式 |
| 内容 | 数据的逻辑结构(表结构)、数据之间的联系、安全性定义、完整性定义 |
| 独立性 | 与物理存储细节无关,与具体应用程序无关 |
-- 模式层:定义数据库的全局逻辑结构
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(20),
age INT,
score DECIMAL(5,2),
class_id INT,
phone VARCHAR(11)
);
4.2.2 外模式(子模式/用户模式)
| 项目 | 说明 |
|---|---|
| 定义 | 局部数据的逻辑结构和特征的描述 |
| 地位 | 用户(应用程序员、最终用户)的数据视图 |
| 数量 | 一个数据库可以有多个外模式 |
| 关系 | 模式与外模式:一对多;外模式与应用:一对多 |
| 作用 | 保证数据安全性,每个用户只能访问被授权的数据 |
-- 外模式1:学生只能看到自己的成绩
CREATE VIEW student_score_view AS
SELECT id, name, score FROM student;
-- 外模式2:教师可以看到完整信息
CREATE VIEW teacher_view AS
SELECT id, name, age, score, class_id FROM student;
-- 外模式3:班主任只看本班学生
CREATE VIEW class_view AS
SELECT * FROM student WHERE class_id = 101;
4.2.3 内模式(存储模式)
| 项目 | 说明 |
|---|---|
| 定义 | 数据物理结构和存储方式的描述 |
| 地位 | 数据在数据库内部的表示方式 |
| 数量 | 一个数据库只有一个内模式 |
| 内容 | 记录的存储方式(顺序/B+树/哈希)、索引的组织方式、数据压缩/加密方式 |
-- 内模式相关(MySQL中的体现)
-- 指定存储引擎
CREATE TABLE orders (
id INT PRIMARY KEY,
amount DECIMAL(10,2)
) ENGINE=InnoDB; -- 指定使用InnoDB引擎
-- 创建索引(影响物理存储)
CREATE INDEX idx_name ON student(name);
4.2.4 三级模式对比表
| 对比项 | 外模式 | 模式 | 内模式 |
|---|---|---|---|
| 别名 | 子模式/用户模式 | 逻辑模式/概念模式 | 存储模式 |
| 定义 | 局部数据的逻辑结构 | 全体数据的逻辑结构 | 数据的物理存储结构 |
| 数量 | 多个 | 1个 | 1个 |
| 服务对象 | 用户/应用程序 | 所有用户(公共视图) | 数据库内部 |
| 抽象层次 | 最高(最接近用户) | 中间 | 最低(最接近物理存储) |
| SQL对应 | CREATE VIEW | CREATE TABLE | CREATE INDEX、存储引擎 |
4.2.5 三级模式的关系
4.3 二级映射与数据独立性
💡 核心思想:通过映射机制,使得一层改变时,另一层不需要改变
4.3.1 什么是数据独立性
定义:数据独立性是指应用程序与数据之间相互独立、互不影响。
分类:
- 物理独立性:数据的物理结构改变时,应用程序不必改变
- 逻辑独立性:数据的逻辑结构改变时,应用程序不必改变
4.3.2 二级映射
💡 DBMS 在三级模式之间提供了二级映射功能,保证了数据库系统中的数据能够具有较高的逻辑独立性与物理独立性
4.3.3 外模式/模式映射 → 逻辑独立性
| 项目 | 说明 |
|---|---|
| 定义 | 定义外模式与模式之间的对应关系 |
| 数量 | 每个外模式对应一个外模式/模式映射 |
| 位置 | 定义在外模式的描述中 |
| 作用 | 保证数据的逻辑独立性 |
工作原理:
- 当模式(表结构)改变时
- DBA 修改外模式/模式映射
- 使外模式保持不变
- 应用程序是根据外模式编写的
- 因此应用程序不必修改
-- ========== 逻辑独立性演示 ==========
-- 原来的模式(表结构)
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(20)
);
-- 创建外模式(视图)给应用使用
CREATE VIEW student_view AS
SELECT id, name FROM student;
-- 应用程序使用 student_view 进行查询
-- SELECT * FROM student_view;
-- 后来修改模式:增加了一列
ALTER TABLE student ADD COLUMN age INT;
-- 但是外模式(视图)还是原来的样子
-- 应用程序通过 student_view 访问,完全不受影响!
-- 这就是逻辑独立性!
4.3.4 模式/内模式映射 → 物理独立性
| 项目 | 说明 |
|---|---|
| 定义 | 定义数据全局逻辑结构与存储结构之间的对应关系 |
| 数量 | 唯一的(一个数据库只有一个) |
| 位置 | 定义在模式中 |
| 作用 | 保证数据的物理独立性 |
工作原理:
- 当内模式(存储结构)改变时
- DBA 修改模式/内模式映射
- 使模式保持不变
- 应用程序是根据模式/外模式编写的
- 因此应用程序不必修改
-- ========== 物理独立性演示 ==========
-- 原来的内模式:使用 MyISAM 存储引擎
CREATE TABLE orders (
id INT PRIMARY KEY,
amount DECIMAL(10,2)
) ENGINE=MyISAM;
-- 应用程序正常使用
-- INSERT INTO orders VALUES (1, 100.00);
-- SELECT * FROM orders;
-- 后来改变内模式:更换为 InnoDB 引擎(支持事务)
ALTER TABLE orders ENGINE=InnoDB;
-- 结果:模式(表结构)没有改变
-- 应用程序的SQL语句完全不用改!
-- 这就是物理独立性!
4.3.5 二级映射总结表
| 映射 | 位置 | 数量 | 保证的独立性 | 作用机制 |
|---|---|---|---|---|
| 外模式/模式映射 | 外模式描述中 | 多个(每个外模式一个) | 逻辑独立性 | 模式改变 → 修改映射 → 外模式不变 → 应用不变 |
| 模式/内模式映射 | 模式中 | 1个 | 物理独立性 | 内模式改变 → 修改映射 → 模式不变 → 应用不变 |
4.4 数据独立性的意义
| 好处 | 说明 |
|---|---|
| 简化应用开发 | 程序员只需关注逻辑结构,不需要了解物理存储细节 |
| 降低维护成本 | 存储结构改变时,不需要修改应用程序 |
| 数据与程序解耦 | 提高系统的灵活性和可维护性 |
| 方便数据库优化 | DBA可以独立调整存储结构以提高性能 |
⬅️ 数据库系统与数据模型 🏠 00-数据库 ➡️ 数据库设计与E-R模型
💬 评论