1. 课程导入与项目全景

很多学习者对 SQL 的认知停留在“会写 SELECT、INSERT、UPDATE、DELETE”这一层。但在真实工程中,一段能跑的 SQL 与一段可交付的 SQL 之间,差距往往不在语法,而在工程化约束:它是否可复现、可测试、可回滚、可观测、可协作。本课程要建立的正是这种从“写查询”到“交付数据系统”的跨越能力。

一、什么是 SQL 工程与数据库综合项目

SQL 工程指把 SQL 及其周边数据库对象(表、视图、索引、约束、存储过程、函数、触发器、迁移脚本)当作软件资产来管理:纳入版本控制、经过评审、通过自动化测试、按环境分级发布、可回滚、可监控。它关注的不是单条语句的写法,而是这些语句如何被组织、验证、部署和长期维护。

数据库综合项目则是一个端到端的实践载体:从需求理解、概念模型与逻辑模型设计,到物理建表、数据装载、查询与事务实现、性能调优、安全与备份,再到交付文档与验收。它把零散的 SQL 知识点串成一条完整的工程链路。

两者结合,就形成了本课程的核心命题:用工程化方法完成一个可运行、可验证、可交付的数据库系统。判断一个项目是否达到“工程级”,可以用四个问题自检:换一台机器能否一键重建?改一条 SQL 能否自动验证不破坏既有行为?上线失败能否在分钟级回滚?运行中能否回答“慢在哪、错在哪”?

二、课程目标与能力地图

本课程不追求覆盖所有数据库特性,而是聚焦四类可迁移能力:

  • 建模与设计能力:能把业务描述转化为实体—关系模型,并规范化为第三范式,同时知道何时为性能做有意识的反正规化。
  • 实现与优化能力:能写出正确的事务逻辑,读懂执行计划,通过索引与重写把慢查询降到可接受区间。
  • 工程化能力:能用迁移脚本管理结构变更,用测试数据与断言验证行为,用版本控制与 CI 保证一致性。
  • 运维与保障能力:能设计备份恢复策略、权限模型与基本监控指标。

这四类能力不是并列的,而是层层支撑:设计决定实现的上限,工程化决定协作的效率,运维决定系统能活多久。

三、交付物清单

一个完整的数据库综合项目,最终应产出以下可检查的交付物。它们既是学习成果,也是工程习惯的训练:

交付物内容要点验收方式
需求与范围说明业务场景、核心实体、关键查询、非功能约束能对应到后续表结构
ER 图与逻辑模型实体、属性、主外键、基数、范式说明无孤立实体、无未定义关系
DDL 迁移脚本按版本编号、可重复执行、含回滚空库一键重建成功
种子与测试数据覆盖正常、边界、异常三类场景测试断言全部通过
核心查询与事务报表查询、并发更新、隔离级别选择结果正确且计划合理
性能报告慢查询清单、执行计划对比、索引依据关键查询达到目标耗时
运维与安全说明备份策略、权限矩阵、监控指标可执行、可演练

四、技术栈选型

选型的原则是“够用、可替换、可解释”,而不是堆砌最新工具。本课程建议的参考栈如下,实际项目中可按团队情况替换同类组件:

  • 数据库:PostgreSQL 或 MySQL 8.x。前者在窗口函数、CTE、JSON、约束表达上更完整,适合教学演示;后者生态与运维资料更普及。二者选其一即可,SQL 主体知识通用。
  • 客户端与脚本:psql / mysql 命令行 + 一个脚本语言(Python 的 psycopg 或 SQLAlchemy)。命令行保证可复现,脚本负责自动化。
  • 版本控制:Git。所有 DDL、DML、测试脚本入库,禁止手工改生产库。
  • 迁移工具:Flyway、Liquibase 或 Alembic。核心是“版本号 + 有序执行 + 记录已应用版本”。
  • 测试:pytest 或任意测试框架,配合临时数据库实例,做到每次提交自动跑一遍。
  • 可观测:数据库自带的慢查询日志、pg_stat_statements / performance_schema,加上 EXPLAIN ANALYZE。
选型时先问三个问题:团队是否熟悉?出问题是否有资料可查?能否在本地完整复现?三个都满足再引入。

五、学习路径与项目推进节奏

课程按“先建骨架、再填血肉、最后加固”的顺序推进。下图展示了从需求到交付的主链路,以及每个阶段对应的关键产物与判断点:

数据库综合项目主链路:阶段 · 产物 · 判断点 ① 需求与建模 实体·关系·约束 ② 建表与迁移 DDL·版本·回滚 ③ 数据与查询 装载·事务·报表 ④ 调优与测试 计划·索引·断言 ⑤ 交付运维 备份·权限·监控 关键产物 ER 图 逻辑模型说明 V1__init.sql U1__rollback.sql seed.sql 核心查询集 EXPLAIN 对比 测试用例集 备份脚本 权限矩阵 通过判断 每个实体有主键 关系基数明确 空库重建成功 回滚可执行 事务结果一致 边界数据不报错 关键查询达标 断言全部通过 恢复演练成功 最小权限生效 发现问题 → 回到对应阶段修正 → 重新验证(迭代闭环) 示例节奏:每阶段 1~2 天,全链路约 2 周完成首轮交付

推进节奏上,建议每个阶段都留下可检查的产物,而不是全部做完再回头补文档。例如建模阶段结束时,ER 图应能直接映射出建表语句的字段与约束;建表阶段结束时,应能在空库上从零执行迁移脚本并成功建出全部对象。这种“阶段可验证”的习惯,正是工程化与随意练习的分水岭。

六、一个最小可运行示例

为了建立直观感受,下面给出项目骨架的第一步:用版本化脚本创建一张核心表。注意脚本命名带版本号,且结构变更与回滚成对出现。

-- V1__create_orders.sql
CREATE TABLE orders (
    order_id     BIGSERIAL PRIMARY KEY,
    customer_id  BIGINT NOT NULL,
    amount       NUMERIC(12,2) NOT NULL CHECK (amount >= 0),
    status       VARCHAR(16) NOT NULL DEFAULT 'created',
    created_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_orders_customer ON orders (customer_id);
CREATE INDEX idx_orders_created  ON orders (created_at);

-- U1__drop_orders.sql(回滚)
DROP TABLE IF EXISTS orders;

执行后可用两条命令验证:\d orders 查看表结构与索引是否齐全;SELECT count(*) FROM orders; 确认表可访问。若迁移工具已记录版本,重复执行 V1 应被跳过而非报错——这正是“可重复执行”的验收点。

常见误区:把建表语句直接粘贴到生产库执行,不记录版本、不写回滚。一旦字段类型选错或索引建错,恢复成本极高。从第一天起就用迁移脚本,是本节最值得养成的习惯。

七、如何判断自己学到位了

本课程的验收不靠背诵,而靠可观察的行为。当你能够:拿到一段业务描述后独立画出 ER 图并说明范式取舍;在空库上用脚本一键重建全部对象;对一条慢查询给出执行计划分析并说明索引为何有效;为一次结构变更写出可回滚的迁移脚本;为关键查询写出覆盖正常与边界场景的测试断言——你就已经具备工程级 SQL 能力。

接下来的章节将沿着上面这条主链路逐段展开:先把模型建对,再把结构管好,然后把查询写快,最后把系统守住。每一步都会落到具体的对象、脚本、参数和判断依据上,而不是停留在概念层面。