在 MySQL、PostgreSQL、Redis、MongoDB 之间选型——本质是「一致性 vs 扩展性」的取舍。
| 类型 | 代表 | 数据模型 | 一致性 | 横向扩展 |
|---|---|---|---|---|
| 关系型 | MySQL、PostgreSQL | 表 + 外键(第 2 章) | 强(ACID) | 难(分库分表) |
| KV 存储 | Redis | 键 → 值 | 弱/可配 | 易(分片) |
| 文档型 | MongoDB | JSON 文档(无固定模式) | 弱(可配) | 易(分片) |
| 列式 / 图 | HBase、Neo4j | 列族 / 图 | 不一 | 不一 |
NoSQL 的动机:放弃部分关系代数能力(连接、强约束、跨行事务),换水平扩展与高吞吐。
| 维度 | MySQL(InnoDB) | PostgreSQL |
|---|---|---|
| 默认隔离级别 | REPEATABLE READ(靠 MVCC+间隙锁) | READ COMMITTED |
| 存储引擎 | InnoDB 单一主流 | 单一引擎,可扩展 |
| 索引 | 聚簇主键 + B+ 树(第 9 章) | 默认 B+ 树,非聚簇为主 |
| 并发 | MVCC + undo 版本链 | MVCC,多版本原地保留 |
| 扩展能力 | 复制成熟、分库分表生态大 | JSONB、窗口函数、可编程性强 |
| 事务 | 完整 ACID | 完整 ACID,隔离级别更全 |
MySQL 生态大、运维资料多、读多写少的 Web 场景顺手;PG 标准更严、功能更强(窗口函数、CTE、JSONB、全文检索),适合对正确性与复杂查询要求高的场景。二者都是第 7、8 章「事务 + 日志」原理的实现。
Redis = 内存键值存储,持久化靠 RDB 快照 + AOF 日志(近似第 8 章 WAL 思想)。
对比:Redis AOF vs 关系库 redo——都是「追加写日志、崩溃后重放」,但 Redis 目标是性能,AOF 可配「每秒刷盘」甚至「不刷」,牺牲持久性;关系库用 WAL + 检查点把持久性做硬。缓存可以丢一点,账本不能丢。
MongoDB 存 BSON 文档,无固定模式(schema-less),集合内文档结构可不同——与第 3 章「模式固定」相反。
| 你的需求 | 指向 | 依据章节 |
|---|---|---|
| 强一致、复杂连接、严格事务 | 关系型(MySQL/PG) | 第 2、4、7、8 章 |
| 读多写少、能容忍短暂不一致 | MySQL + Redis 缓存 | 第 7 章隔离、第 9 章索引 |
| 结构多变、文档型、快速上线 | MongoDB | 第 5 章反规范化 |
| 热点数据、计数器、会话 | Redis | 第 9 章内存/哈希 |
| 复杂分析、报表、多维聚合 | 列式 / OLAP 引擎 | 第 5 章反规范化 + 第 4 章聚合 |
对比:关系型 vs NoSQL——关系型用「表 + 连接 + 事务」换强一致与复杂查询,代价是扩展难、模式僵;NoSQL 四类各自放弃一部分(连接、强事务、固定模式、磁盘持久化)换扩展性与专项性能。理解关系型的「完全体」,才知道每处裁剪丢掉什么。