物理结构设计、实施和运行维护

从设计到落地:怎样把"关系模式"变成可运行的真实数据库

🎯 本节课你需要掌握的(按重要程度排序)
  • 索引的作用、何时建、何时不建 必考
  • 聚集的概念和作用 必考
  • 怎么为字段选择合适的数据类型(实操)必考
  • 数据库实施的 5 个步骤 必考
  • 数据库运行维护的 4 项工作 必考
  • 数据库设计 6 阶段全流程串联(设计部分小结)小结

📦 先回顾一下我们已经走过的路:

第 11 章 需求分析 → 第 13 章 画 E-R 图 + 转关系模式 → 第 12 章 规范化(3NF)

到现在为止,你手上已经有 一组规范的关系模式,比如:

商品(商品编号, 商品名, 生产厂家, 入库时间, ...)

但这还不能跑!还差最后一步:把它真正变成一个可以运行的 MySQL 数据库。

👉 这就是本章要讲的:物理结构设计 → 实施 → 运行维护。

一、物理结构设计是什么?了解

1.1 一句话定义

📖 定义

物理结构设计就是 "决定数据怎么存" —— 选什么数据类型、要不要建索引、加什么约束等。

🌰 用搬家做类比

逻辑结构设计(第 13 章)= 决定家里有几个房间、各放什么家具(关系模式)。

物理结构设计(本章)= 决定每件家具用什么材质(数据类型)、要不要装抽屉拉手(索引)、桌子放哪个角落(存储位置)。

家具一样,但材质不同、布局不同,使用体验天差地别。

1.2 物理设计要做的 4 件事了解

物理设计阶段需要决定 4 件事,但我们重点只学前两件(其他了解即可):

📋 4 件事
  • ① 确定数据的存储结构(聚集?索引?)必考
  • ② 设计合适的存取路径(用什么方式查询)必考
  • ③ 确定数据的存放位置(哪些放在快盘、哪些放在慢盘)了解
  • ④ 确定系统配置(DBMS 的各种参数)了解
💡 实际工作中

对学生来说,会用数据类型、会建索引 就够了,③ 和 ④ 是 DBA(数据库管理员)的工作,大部分应用开发人员不需要管。

二、索引与聚集(核心重点)必考

2.1 索引和聚集 —— 加速查询的两大法宝

查询慢是数据库最常见的性能问题。解决办法主要靠两个:

🧲 聚集(Cluster)

把有相同值的记录放在一起存储(同一个物理块里)。

特点:节省存储空间 + 提高同类查询的速度

📑 索引(Index)

给某个字段建立"目录",让查找更快。

特点:查询快 + 但增删改慢(要维护)

2.2 索引(Index)—— 必考核心必考

📖 一句话定义

索引就像 "书的目录" —— 不用翻整本书,直接通过目录查到想要的内容在第几页。

🌰 通俗类比

想象一本 1000 页的字典,要查"鸿"字:

① 没有目录:从第 1 页开始一页页翻,平均要翻 500 页才找到 → 全表扫描。

② 有目录(索引):先看目录"鸿 → 第 326 页",直接跳到 326 页 → O(log n) 查找。

索引的作用

✅ 索引的好处

① 大大提高查询速度(最主要的作用)

② 在主码上建唯一索引,避免重复值,确保数据完整性

⚠️ 索引的代价

① 占用额外的存储空间(目录本身要占地方)

② 每次增删改时要维护索引(INSERT / UPDATE / DELETE 会变慢)

③ 索引建多了反而 增加 DBMS 选择索引的时间

⭐ 索引的核心权衡

索引不是越多越好。要在"查询速度" vs "增删改速度" + "存储空间"之间权衡。

2.3 何时建索引?何时不建?必考

这是 必考点,记住这张判断表:

场景建议原因
主码(主键) ✅ 一定要建 提高查询速度 + 防止主码重复
经常出现在 WHERE 子句的字段(频繁查询) ✅ 应该建 大幅提升查询性能
JOIN 时的连接字段(外键) ✅ 应该建 多表连接时性能关键
频繁更改的字段 ❌ 不建议建 每次更改都要维护索引,得不偿失
很少用于查询的字段 ❌ 不要建 占空间又用不上
取值很少(如"性别")的字段 ❌ 不要建 区分度低,索引效果差
⭐ 必背口诀

"主码一定建、查得多的建、改得多的不建、取值少的不建"

2.4 聚集(Cluster)必考

📖 一句话定义

聚集就是把 "同一个属性值相同" 的元组(记录)"放在一起"存储(同一个物理块中)。

这个用来分组的属性叫 聚集码。

🌰 用图书馆类比

图书馆里的书有两种摆法:

① 不聚集:随便往书架上塞,按入库顺序放 —— 找"计算机"类的书要满楼跑。

② 按类别聚集(聚集码 = 类别):所有"计算机"书放一起、"文学"书放一起 —— 一去就能找一片。

✅ 聚集的两个作用

① 节省存储空间(重复值压缩)

② 大大提高按聚集码查询的效率

⚠️ 注意

聚集 只对"按聚集码查询" 有加速效果。如果按其他字段查询,反而可能更慢。

所以聚集码要选 查询频率最高、并且用作分组依据 的字段。

💡 在 MySQL 中,InnoDB 表的主键自带聚集(这就是为什么主键查询特别快)。

三、为字段选择合适的数据类型实操必考

3.1 MySQL 常用数据类型速查表必考

物理设计的实操核心就是:给每个字段选合适的数据类型。下面是最常用的几类:

类别常用类型什么时候用
整数 INT / BIGINT / TINYINT 编号、计数、状态值(小整数用 TINYINT 省空间)
小数 DECIMAL(M,N) 金额、价格(精确小数,必须用 DECIMAL)
字符(定长) CHAR(n) 长度固定的字段(学号、身份证号、手机号)
字符(变长) VARCHAR(n) 长度不定的字段(姓名、地址、商品名)
大文本 TEXT 长文本(商品描述、评论),最大 64KB
日期 DATE 只到日(生日、入库日期)
日期时间 DATETIME 到秒(订单时间、登录时间)
⭐ 4 个最容易出错的选择题

① 身份证号、手机号用什么?
→ CHAR(18) 或 CHAR(11),不要用 INT!(开头 0 会丢,超出范围)

② 金额用什么?
→ DECIMAL(M,N),不要用 FLOAT 或 DOUBLE!(浮点数会丢精度)

③ 姓名用什么?
→ VARCHAR(20) 或 VARCHAR(50),不用 CHAR(姓名长度不固定)

④ 商品 ID用什么?
→ CHAR(n) 如果是有规律的编码(如"01001"),INT AUTO_INCREMENT 如果是自增主键

3.2 CHAR vs VARCHAR:考试最爱考必考

🔒 CHAR(n) 定长

不管实际多长,固定占 n 个字符的空间(不够用空格补齐)。

✓ 查询速度快

✗ 浪费存储空间(短数据也占满)

适合:长度固定的字段,如学号、身份证号、手机号

📏 VARCHAR(n) 变长

实际多长就占多长,n 只是上限。

✓ 节省存储空间

✗ 查询速度比 CHAR 略慢

适合:长度不定的字段,如姓名、地址、商品名

💡 选择口诀

"长度定 → CHAR;长度变 → VARCHAR"

简单记:身份证号 18 位永远不变 → CHAR(18);姓名可能 2~10 个字 → VARCHAR(20)。

3.3 案例:把第 13 章的关系模式落地

来个实际例子。假设第 13 章设计完,得到了这两个关系模式:

📋 关系模式

供应商(供应商编号, 供应商名称, 电子邮箱, 联系方式)

商品(商品编号, 商品名, 生产厂家, 入库时间, 概述, 缩略图)

供应商表的物理设计

字段名字段描述数据类型约束选型理由
supid 供应商编号 CHAR(5) 主码 编号格式固定(如"01000")
supname 供应商名称 VARCHAR(40) 非空 名称长短不一
email 电子邮箱 VARCHAR(40) — 邮箱长短不一,可空
telephone 联系方式 CHAR(11) — 手机号固定 11 位

商品表的物理设计

字段名字段描述数据类型约束
commodityid商品编号CHAR(11)主码
commodityname商品名VARCHAR(40)非空
manufacturer生产厂家VARCHAR(40)—
storagetime入库时间DATETIME—
summary概述VARCHAR(500)—
thumbnail缩略图VARCHAR(100)—
💡 注意"缩略图"的设计

缩略图本来是图片(二进制数据)。不要直接存到数据库里(图片可能几 MB,会撑爆数据库)。

常见做法:把图片存到磁盘或 OSS,数据库里只存"路径字符串" → 用 VARCHAR(100) 存路径就够了。

四、数据库实施:5 个步骤必考

4.1 什么是数据库实施?

📖 定义

数据库实施 = 把设计图纸变成真实运行的数据库。具体就是:根据前面所有的设计成果,在 MySQL 里建表、装数据、调试程序、试运行。

🌰 类比盖房子

前面 11~13 章 = 设计师画图纸
本章物理设计 = 选材料(钢筋什么型号、地砖什么品牌)
数据库实施 = 工人按图纸真正盖房子

4.2 实施的 5 个步骤必考

实施过程要走 5 步,必考点是 能按顺序说出这 5 步:

1
建立数据库结构
CREATE TABLE 等
2
装入数据
导入初始数据
3
编码与调试
写应用程序
4
数据库试运行
功能/性能测试
5
整理文档
交付资料

① 建立数据库结构

用 SQL 的 DDL 语句建库、建表、建索引。承接前面所有的设计成果。

SQL · 建表示例
CREATE TABLE Supplier (
    supid     CHAR(5)     NOT NULL COMMENT '供应商编号',
    supname   VARCHAR(40)  NOT NULL COMMENT '供应商名称',
    email     VARCHAR(40)            COMMENT '电子邮箱',
    telephone CHAR(11)            COMMENT '联系方式',
    PRIMARY KEY (supid)
);

-- 建索引
CREATE INDEX idx_supname ON Supplier(supname);

② 装入数据

这是 实施阶段最主要的工作。要保证数据 准确无误,必须做严格的 校验。

实际工作中常见做法:

  • INSERT INTO(少量数据手工录入)
  • LOAD DATA INFILE(从 CSV / Excel 批量导入)
  • 从老系统迁移数据(写迁移脚本)

③ 应用程序编码与调试

开发能 调用数据库 的程序(网页、App、桌面软件等)。

这部分超出本课程范围,是软件工程的内容。

④ 数据库试运行(联合调试)

这一步要做 两种测试:

两种测试

① 功能测试:实际运行程序,看每个功能能不能用。

② 性能测试:测试系统的响应时间、吞吐量等性能指标,看是否符合设计目标。

⚠️ 不达标怎么办?

如果测试不达标,要 返回到设计阶段,重新修改设计 —— 有时甚至要回到 逻辑结构设计(第 13 章)重新调整结构。

⑤ 整理文档

编写 测试报告、技术说明书、用户使用说明书,跟系统一起交给用户。

看似不重要,但是真实项目里 很多 bug 修复后没文档记录,下次出问题没人记得。

五、数据库运行维护:4 项工作必考

5.1 为什么要"运行维护"?

📖 一句话

数据库一旦投入使用,不是一劳永逸,而是要 长期维护。需求会变化、数据会增长、问题会出现 —— 必须有人持续运维。

这个工作通常由 DBA(数据库管理员) 来做。

5.2 4 项核心维护工作必考

必考点:能按顺序说出这 4 项工作。

①

转储和恢复数据库

定期 备份 数据库和日志,防止数据丢失。出问题时能 恢复 到正确状态。

📚 第 10 章学过
②

维护安全性与完整性

检查系统安全、给用户分配 权限;调整 完整性约束 以适应新需求。

📚 第 8 章学过
③

监测并改善性能

用工具监测数据库性能,找出 慢的地方(慢 SQL、不合理的索引),进行优化。

📚 慢查询日志
④

重新组织和构造数据库

重组织:不改逻辑结构,重新整理数据存放(碎片整理)。
重构造:改逻辑结构(增加字段、改表结构)。

长期工作
⭐ 必背口诀

"备恢复、保安全、调性能、重结构"

= 转储恢复 + 维护安全完整性 + 改善性能 + 重新组织构造

5.3 重组织 vs 重构造了解

这两个词容易搞混,但其实区别很简单:

🔄 重组织

不改逻辑结构,只是重新整理数据的物理存放。

类比:屋子里东西放乱了,重新整理一下,但不挪墙、不加房间。

🏗️ 重构造

修改逻辑结构(加字段、改表结构等)。

类比:客厅打通改大、卧室加个飘窗 —— 房屋结构变了。

六、数据库设计 6 阶段全流程总结必看

📋 完整的数据库设计流程

本章学完,"数据库设计"这条主线就讲完了。从需求到上线运维,我们走过的路:

🎓 数据库设计的 6 个阶段 ① 需求分析 弄清楚要什么 第 11 章 ② 概念设计 画 E-R 图 第 13 章 ③ 逻辑设计 转关系模式 + 3NF 第 13、12 章 ④ 物理设计 数据类型 + 索引 本章 14 ⑤ 实施 CREATE + 装数据 本章 14 ⑥ 运维 长期工作 本章 14 业务需求 E-R 图 关系模式 物理结构 可运行的数据库 持续优化 这是数据库设计的主线 —— 从需求到运维的完整闭环 第 1-3 章 · 数据库基础理论 · 关系模型 第 4-6 章 · SQL 基础(DDL/DML/DQL) 第 7 章 · 视图 第 8 章 · 安全管理 第 9 章 · 并发控制(事务+锁) 第 10 章 · 备份还原 + 日志 第 11-14 章 · 数据库设计(本章结束) 第 15-17 章 · 高级主题(待学)
🎯 6 阶段全流程速记

需求分析 → 概念设计 → 逻辑设计 → 物理设计 → 实施 → 运维

简称:"需 概 逻 物 实 维"。期末必背!

七、本章小结

📋 三句话总结整章

🎯 核心逻辑
  • 物理设计核心是选数据类型+建索引。索引"主码必建、查得多建、改得多不建"。
  • 实施就是把设计落地的 5 步:建结构 → 装数据 → 编码调试 → 试运行 → 整理文档。
  • 运维是长期工作 4 项:转储恢复、安全完整、性能监测、重组重构。

本章必考点回顾

⭐ 期末考点

  1. 索引何时建、何时不建(必考!)
  2. 聚集的概念和作用
  3. CHAR vs VARCHAR 的区别(数据类型选择)
  4. 数据库实施的 5 个步骤(顺序题)
  5. 数据库运行维护的 4 项工作
  6. 数据库设计的 6 个阶段(综合题/简答题)

课堂综合测验

第 1 题

下列字段中,最不应该 建索引的是?

A. 学生表的"学号"字段(主键)
B. 订单表的"客户编号"字段(外键,频繁连接)
C. 用户表的"性别"字段(取值只有男/女)
D. 商品表的"商品名"字段(经常用于 WHERE 模糊查询)

✅ 正确:C

"性别"只有男/女两种值,区分度极低,建索引基本没用(每次还要扫描一半数据),还浪费空间和增删改时间。

口诀:"主码一定建、查得多的建、改得多的不建、取值少的不建"。

第 2 题

为下列字段选择数据类型,错误 的是?

A. 商品价格 → DECIMAL(10,2)
B. 手机号码 → INT
C. 用户姓名 → VARCHAR(20)
D. 订单时间 → DATETIME

✅ 错误的是:B

手机号 11 位,不能用 INT!原因:

① 11 位数字可能超出 INT 范围(INT 最大约 21 亿)

② 手机号开头的 0 会被截掉(虽然中国手机号不以 0 开头,但有些国家号码会)

③ 手机号永远不参与运算 —— 用 CHAR(11) 最合适。

第 3 题

数据库实施阶段的 5 个步骤,正确顺序 是?

A. 装入数据 → 建立结构 → 编码调试 → 试运行 → 整理文档
B. 建立结构 → 装入数据 → 编码调试 → 试运行 → 整理文档
C. 编码调试 → 建立结构 → 装入数据 → 试运行 → 整理文档
D. 建立结构 → 编码调试 → 装入数据 → 试运行 → 整理文档

✅ 正确:B

逻辑:先有表结构(房子盖好),才能往里装数据(搬家具),然后编码(接电接水)、试运行(搬入住一段时间)、最后整理文档(写一份说明书)。

第 4 题

下列 不属于 数据库运行维护工作的是?

A. 定期备份数据库
B. 监测系统性能、优化慢 SQL
C. 画 E-R 图、设计概念结构
D. 给新用户分配权限

✅ 错的是:C

画 E-R 图是 概念结构设计(第 13 章,6 阶段中的第 ② 步),不是运维工作。

运维 4 项工作:转储恢复 + 维护安全完整 + 改善性能 + 重新组织构造。A、B、D 都属于。

第 5 题

数据库设计的 6 个阶段,正确顺序 是?

A. 概念设计 → 需求分析 → 逻辑设计 → 物理设计 → 实施 → 运维
B. 需求分析 → 概念设计 → 逻辑设计 → 物理设计 → 实施 → 运维
C. 需求分析 → 逻辑设计 → 概念设计 → 物理设计 → 实施 → 运维
D. 需求分析 → 概念设计 → 物理设计 → 逻辑设计 → 实施 → 运维

✅ 正确:B

速记:"需 概 逻 物 实 维"

逻辑:先弄清楚要什么(需求)→ 抽象画图(概念)→ 转关系模式(逻辑)→ 选数据类型(物理)→ 实际建库装数据(实施)→ 长期维护(运维)。

🚀 下节课:习题课

下节课通过练习巩固本章知识:

  • 📝 概念巩固(索引、聚集、数据类型)
  • 💻 为关系模式选择数据类型(实操题)
  • 📋 判断哪些字段该建索引(必考)
  • 🎯 综合大题:从给定关系模式 → 物理设计 → 写出 CREATE TABLE

提示:本章是 数据库设计主线的最后一章。后面还会学 第 15 章存储过程与函数、第 16 章触发器和事件、第 17 章 Python 连接 MySQL 这三个高级主题。