CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

数据库原理与 SQL:从关系模型到事务隔离

分类:计算机基础 · 路径:docs/topics/db-and-sql/README.md

#database#sql#index#transaction#schema

用 6~10 周从 SQL 基础到能设计表结构、分析查询计划、调优索引与事务

父主题

顶层主题

子主题(4)

数据库原理与 SQL:从关系模型到事务隔离

0. 元信息

1. 学习路线

关系与约束 → SELECT 与表达式 → JOIN/聚合/窗口 → 表设计与范式 → B+Tree 与索引 → EXPLAIN ANALYZE → ACID/锁/MVCC → 隔离级别 → 综合调优

每一步都配可运行 SQL。PostgreSQL 是主环境,MySQL 用来做差异对照。

2. 阶段周数分配

阶段6 周方案10 周方案产出
1. 关系模型0.51键、约束与关系代数笔记
2. SQL 基础0.751查询练习
3. JOIN/聚合/窗口0.751.5分析查询
4. 表设计0.751.5ERD 与迁移脚本
5. 索引0.751.5索引实验
6. 查询计划0.751.5EXPLAIN 报告
7. 事务与隔离11.5双会话实验
8. 综合项目0.750.5数据库设计与性能报告

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1relation、tuple、attribute、candidate key、constraint订单关系定义能区分逻辑模型与物理表
2DDL、DML、NULL、三值逻辑、子查询30 条 SQL能预测 NULL 参与比较的结果
3INNER/OUTER JOIN、GROUP BY、CTE、窗口函数销售报表能避免重复计数和错误连接
4FD、1NF/2NF/3NF/BCNF、反范式ERD、DDL能从函数依赖推导分解
5B+Tree、Hash、GiST、复合/覆盖/部分索引索引基准能解释列顺序和选择性
6planner、统计信息、scan/join/sort计划对比能读 estimated/actual rows 与 buffers
7ACID、WAL、锁、MVCC双会话脚本能复现脏读、不可重复读或写偏差
8隔离、死锁、重试、短事务并发测试能从等待图解释死锁
9schema、query、index、transaction 综合性能报告能以基线、改动、结果证明优化

4. 第一周任务

Day 1 运行约定:PostgreSQL 16+;用 psql -v ON_ERROR_STOP=1 执行脚本。每次记录 SELECT version();、DDL、测试数据和输出。

任务当天交付
Day 1建库,练 CREATE TABLE、PK、FK、CHECKschema.sql
Day 2SELECT、过滤、排序、NULLqueries-basic.sql
Day 3INNER/LEFT JOINjoins.sql
Day 4聚合与 HAVING销售汇总
Day 5CTE、子查询、窗口函数排名与移动平均
Day 6EXPLAIN (ANALYZE, BUFFERS)两份计划
Day 7步骤 A:做订单最小库和 5 条查询;步骤 B:补空表、NULL、重复键、孤儿外键四类测试可重跑脚本与实际输出

5. 阶段通用验收

  1. 脚本能在空库重复执行;
  2. 能用自己的话解释语义和代价;
  3. 保存 schema、数据、SQL、计划与耗时;
  4. 测空表、NULL、重复值、并发失败;
  5. 至少三组规模不同的数据;
  6. 同时看正确性与 P95 延迟;
  7. 改动后重跑相同基准。

6. 最终验收

7. 综合项目

首选:小型电商数据库。交付 ERD、DDL、种子数据、查询集、索引实验、并发实验与性能报告。查询覆盖商品搜索、库存扣减、订单统计和用户排行。库存扣减必须用事务并测试并发。

备选:图书借阅系统 / SaaS 计费系统。

项目必须包含需求、数据约束、迁移脚本、可重跑测试、查询计划、事务边界、异常路径、README 和 notes/retrospective.md

8. 推荐开源资料

角色资料用法
主文档PostgreSQL Documentation查 SQL、索引、并发控制和 EXPLAIN
差异对照MySQL Reference Manual对照 InnoDB、optimizer 与 SQL 方言
课程CMU 15-445看存储、索引、事务实现
课程Berkeley CS186做关系代数、查询优化与恢复练习
索引Use The Index, Luke用可执行案例理解索引与 SQL 性能
练习SQLBolt快速补 SQL 语法

9. 学习资料汇聚(v0.3 自包含)

本节由本计划生成。资料用作导航。结论要回到 SQL 输出、查询计划或官方文档。

9.1 背景与动机

关系模型由 Edgar F. Codd 在 1970 年提出。它用 relation 与谓词逻辑隔离数据的逻辑含义和物理存放。SQL 后来成为主流接口,但它包含 bag semantics、NULL 和三值逻辑,不能简单等同于关系代数。

数据库负责持久化、并发、恢复和高效访问。应用中的重复数据、慢查询、丢失更新与死锁,常落在 schema、query、index、transaction 四个边界。我们学它们是为了能用证据改系统。

9.2 概念地图

flowchart LR
  RM[关系模型] --> SQL[SQL]
  RM --> FD[函数依赖与范式]
  SQL --> Algebra[关系代数]
  SQL --> Plan[查询计划]
  FD --> Schema[Schema 与约束]
  Schema --> Stats[统计信息]
  Index[B+Tree / Hash / GiST] --> Plan
  Stats --> Plan
  Plan --> Exec[执行器]
  Tx[事务] --> Lock[锁]
  Tx --> MVCC[MVCC]
  WAL[WAL / binlog] --> Recovery[恢复与复制]
  Lock --> Isolation[隔离级别]
  MVCC --> Isolation
  Exec --> Tx

关系模型约束数据含义。SQL 被 planner 改写成执行计划。索引和统计信息影响访问路径。事务借助锁、MVCC 与 WAL 保证并发和恢复。

9.3 基础知识讲解

9.3.1 经典论文

资料贡献读法
Codd, A Relational Model of Data for Large Shared Data Banks关系模型精读 data independence、normal form
Selinger et al., Access Path Selection in a Relational Database Management SystemSystem R 成本优化器跟 EXPLAIN 对照 join order 与 cost
Gray et al., Granularity of Locks and Degrees of Consistency锁模式与隔离画兼容矩阵与异常
Kung & Robinson, On Optimistic Methods for Concurrency Control乐观并发控制对比 2PL 与 OCC
Stonebraker et al., The Design of the POSTGRES Storage SystemPostgreSQL 架构源流对照现代 PostgreSQL 文档

9.3.2 经典书籍

侧重用法
Silberschatz, Korth & Sudarshan, Database System Concepts数据库教材全景主线读关系、索引、优化、事务
C. J. Date, Database Design and Relational Theory关系理论与设计精读键、依赖、规范化
C. J. Date, An Introduction to Database Systems关系模型与 DBMS查概念边界
Joe Celko, SQL for Smarties高级 SQL 模式做集合、树、窗口查询
Kleppmann, Designing Data-Intensive Applications分布式数据系统学完单机事务后再读

9.3.3 优秀博客与文档

资料特点用法
Use The Index, LukeMarkus Winand 的 SQL 索引教程复现实验,不背规则
PostgreSQL DocumentationPostgreSQL 权威文档EXPLAIN、index、MVCC
MySQL Reference ManualMySQL/InnoDB 权威文档做方言和行为对照
Planet PostgreSQL社区工程文章找版本相关实践后回官方文档核对
Andy Pavlo / CMU Database Group课程、论文与系统讨论配合 15-445 课程

9.3.4 核心人物

人物影响建议材料
Edgar F. Codd关系模型1970 论文
C. J. Date关系理论与数据库教育Database Design and Relational Theory
Jim Gray事务、锁、系统研究事务论文与 Transaction Processing
Michael StonebrakerIngres、Postgres、数据库系统POSTGRES 论文与访谈
Pat Selinger成本查询优化System R optimizer 论文
Andy Pavlo现代数据库系统教学与研究CMU 15-445 课程与 Database Group 资料

9.3.5 开发与学习方法

方法动作何时用
Query-first先写预期结果,再写 SQL防止只追求“能跑”
Plan-first tuning保存基线计划,再改一处慢查询调优
Data-shape testing改数据量、选择性、倾斜、NULL检查计划稳定性
Two-session experiment两个 psql 会话控制交错锁、隔离、死锁
Constraint-first schema把业务不变量写成约束表设计与迁移
Differential testPostgreSQL/MySQL 对跑识别标准 SQL 与实现差异
Course-lab loopCMU 15-445 / Berkeley CS186 讲义配实验补系统实现视角

9.4 经典问题与经典案例

问题为什么重要最简答案或证据
NOT IN 遇到 NULL 返回空三值逻辑常制造线上 bugNOT EXISTS 并明确 NULL 语义
LEFT JOIN 后在 WHERE 过滤右表会意外变成 INNER JOIN过滤条件放 ON,或显式保留 NULL
JOIN 后聚合翻倍多对多连接扩大行数先按目标粒度聚合,再连接
有索引仍 Seq Scan小表、低选择性、统计误差都可能合理看 actual rows、buffers 与总代价
复合索引顺序怎么选决定可用前缀与排序能力由查询谓词、范围条件、排序和选择性共同决定
EXPLAIN ANALYZE 是否安全它会真实执行语句写操作放事务中并 ROLLBACK
隔离级别高就没异常吗Snapshot Isolation 仍可能写偏差明确不变量,必要时 SERIALIZABLE 或显式锁
死锁怎么处理数据库只能中止一个事务固定加锁顺序,缩短事务并重试
范式越高越好吗读路径与约束成本有权衡先保证正确,再用测量证明反范式收益
WAL 与 binlog 一样吗日志层级和用途不同PostgreSQL WAL 记录物理变化;MySQL binlog 面向复制/恢复,InnoDB 另有 redo/undo

9.5 学习难点

概念难点

难点为什么会卡突破路径
SQL 与关系代数SQL 有重复、NULL、顺序扩展对同一查询写代数树,再观察重复与 NULL
逻辑 schema 与物理访问表定义看不出 heap/index 路径EXPLAIN (ANALYZE, BUFFERS) 连起来
MVCC 可见性同一行有多个版本画 transaction id、snapshot、tuple version 时间线

思维难点

难点为什么会卡突破路径
集合式思维容易逐行循环先写结果关系的列、键和谓词
成本而非规则“索引一定快”是错的用数据规模与选择性做成对实验
并发交错单会话看不到异常写事务 T1/T2 的逐步 schedule

工程难点

难点为什么会卡突破路径
生产调优缓存、参数、数据倾斜会干扰保存 SQL、参数、计划、buffers、数据规模
在线迁移DDL 可能锁表或重写表查目标版本文档,在副本和压测数据演练
跨数据库差异SQL 相似,默认隔离和 optimizer 不同记录版本并做 differential test

9.6 技术标准与接口

9.6.1 Entity

名称主流版本发布组织状态许可证 / 可访问性
PostgreSQL16~18PostgreSQL Global Development Group活跃PostgreSQL License;文档公开
MySQL8.4 LTS / 9.x InnovationOracle活跃GPLv2 Community / 商业版;文档公开
SQLite3.xSQLite Consortium活跃Public Domain;文档公开
Oracle Database19c / 23aiOracle活跃商业许可;文档公开
SQL Server2022 / 2025Microsoft活跃商业/Developer;文档公开
SQL 标准ISO/IEC 9075ISO/IEC JTC 1/SC 32持续修订标准正文通常收费

9.6.2 Scope

SQL 标准定义数据定义、查询、更新、约束与事务语义。具体数据库实现存储、索引、优化器、锁、MVCC、恢复和复制。SQL 标准不规定 PostgreSQL VACUUM、MySQL InnoDB redo 或 Oracle optimizer 的全部行为。

9.6.3 Structure

必须掌握:DDL/DML、数据类型、PK/FK/UNIQUE/CHECK、SELECT、JOIN、GROUP BY、窗口函数、事务控制、隔离级别。实现接口包括 PostgreSQL system catalogs、EXPLAINANALYZEVACUUM、锁视图和统计视图。

9.6.4 Ecosystem

主流关系数据库是 PostgreSQL、MySQL、SQLite、Oracle、SQL Server。驱动遵循 DB-API、JDBC、ODBC 等接口。迁移工具、连接池、ORM 和 CDC 位于 DBMS 外。标准 SQL 与产品方言要明确区分。

9.6.5 Depth Tiers

层级能力可观察标准
L0知道存在知道表、SQL、索引、事务分别做什么
L1看得懂示例能读 DDL、SELECT 和简单计划
L2能正确调用能写 JOIN、约束、索引和事务
L3能解释与排错能定位错误结果、坏计划、锁等待与隔离异常
L4能设计与扩展能实现优化器、存储引擎或并发控制组件

本计划要求达到 L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:计算机基础 主 + Web 与后端 辅。


直接依赖(1)

查看知识图谱 · 热度 🔥极高