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

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

🎯 本节课你需要掌握的(按重要程度排序)
  • 索引的作用、何时建、何时不建 必考
  • 聚集的概念和作用 必考
  • 怎么为字段选择合适的数据类型(实操)必考
  • 数据库实施的 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 这三个高级主题。