第 10 章 · 数据库对比与应用

在 MySQL、PostgreSQL、Redis、MongoDB 之间选型——本质是「一致性 vs 扩展性」的取舍。

10.1 关系型 vs NoSQL 四大类

类型代表数据模型一致性横向扩展
关系型MySQL、PostgreSQL表 + 外键(第 2 章)强(ACID)难(分库分表)
KV 存储Redis键 → 值弱/可配易(分片)
文档型MongoDBJSON 文档(无固定模式)弱(可配)易(分片)
列式 / 图HBase、Neo4j列族 / 图不一不一

NoSQL 的动机:放弃部分关系代数能力(连接、强约束、跨行事务),换水平扩展与高吞吐。

10.2 MySQL(InnoDB)vs PostgreSQL

维度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 章「事务 + 日志」原理的实现。

10.3 Redis:内存 KV

Redis = 内存键值存储,持久化靠 RDB 快照 + AOF 日志(近似第 8 章 WAL 思想)。

  • 强项:微秒级延迟、丰富数据结构(String/List/Hash/Set/ZSet)、原子操作、发布订阅;常做缓存、会话、计数器、排行榜。
  • 弱项:内存有限、数据量大成本高;持久化/复制异步,极端情况可能丢最近数据,不保证强一致。

对比:Redis AOF vs 关系库 redo——都是「追加写日志、崩溃后重放」,但 Redis 目标是性能,AOF 可配「每秒刷盘」甚至「不刷」,牺牲持久性;关系库用 WAL + 检查点把持久性做硬。缓存可以丢一点,账本不能丢。

10.4 MongoDB:文档数据库

MongoDB 存 BSON 文档,无固定模式(schema-less),集合内文档结构可不同——与第 3 章「模式固定」相反。

  • 强项:嵌套文档免去多表连接、模式灵活、天然分片;适合快速迭代、结构多变、写入量大。
  • 弱项:多文档跨集合事务近年才支持且代价高;无真正连接,复杂关系查询要手动聚合或反规范化。

10.5 选型决策

你的需求指向依据章节
强一致、复杂连接、严格事务关系型(MySQL/PG)第 2、4、7、8 章
读多写少、能容忍短暂不一致MySQL + Redis 缓存第 7 章隔离、第 9 章索引
结构多变、文档型、快速上线MongoDB第 5 章反规范化
热点数据、计数器、会话Redis第 9 章内存/哈希
复杂分析、报表、多维聚合列式 / OLAP 引擎第 5 章反规范化 + 第 4 章聚合
  • 范式(第 5 章)决定关系库拆表;反规范化是 NoSQL 与 OLAP 的默认姿态——在「一致性」和「读性能」间选边。
  • 事务与隔离(第 7 章)决定能否接受最终一致:核心账务必须 ACID,浏览计数可以近似。
  • 索引(第 9 章)是通用杠杆:Redis 用哈希、关系库用 B+ 树、MongoDB 也有 B 树索引,底层思想同源。

对比:关系型 vs NoSQL——关系型用「表 + 连接 + 事务」换强一致与复杂查询,代价是扩展难、模式僵;NoSQL 四类各自放弃一部分(连接、强事务、固定模式、磁盘持久化)换扩展性与专项性能。理解关系型的「完全体」,才知道每处裁剪丢掉什么。