name: 数据系统架构
description: 在设计数据密集型应用的数据库时使用,进行性能相关的模式决策,在规范化和反规范化之间选择,选择存储/索引策略,规划扩展,或评估OLTP与OLAP的权衡。当遇到N+1查询、ORM问题或并发问题时也可使用。
数据系统架构
概述
核心原则: 良好的数据系统架构平衡了可靠性(在故障下正确操作)、可扩展性(优雅地处理增长)和可维护性(随时间实现高效变更)。每个架构决策都涉及这些关注点之间的权衡。
这项技能综合了以下三部基础著作的知识:
- 设计数据密集型应用(Kleppmann) - 分布式系统、存储引擎、扩展
- PostgreSQL的艺术(Fontaine) - PostgreSQL特定模式、SQL作为编程
- PostgreSQL查询优化(Dombrovskaya等人) - 执行计划、性能调优
何时使用
| 症状 |
从何处开始 |
| 设计新的数据库/模式 |
01-基础原则.md |
| 规范化和反规范化决策 |
02-数据建模.md |
| 需要理解OLTP与OLAP |
03-存储引擎.md |
| 查询缓慢,索引选择 |
04-索引.md |
| 规划增长,读副本 |
05-扩展模式.md |
| 竞态条件、死锁、隔离问题 |
06-事务并发.md |
| N+1查询、ORM问题、应用集成 |
07-应用集成.md |
导航
参考文件(根据需要加载)
01-基础原则.md - 可靠性/可扩展性/可维护性、负载参数
02-数据建模.md - 规范化、反规范化、模式设计模式
03-存储引擎.md - B-树、LSM-树、OLTP vs OLAP、PostgreSQL内部机制
04-索引.md - 索引类型、复合索引、覆盖索引、维护
05-扩展模式.md - 复制、分区、分片策略
06-事务并发.md - ACID、隔离级别、MVCC、锁定模式
07-应用集成.md - ORM陷阱、N+1、业务逻辑放置、批处理
快速决策框架
新系统设计?
├─ 是 → 阅读01,然后02用于数据模型
└─ 否 → 问题是什么?
├─ "查询缓慢" → 阅读04(索引)+ 03(存储模式)
├─ "数据不一致" → 阅读02(建模)+ 06(事务)
├─ "无法处理负载" → 阅读05(扩展)+ 03(OLTP vs OLAP)
├─ "应用发出太多查询" → 阅读07(N+1、ORM模式)
└─ "竞态条件/死锁" → 阅读06(并发)
核心概念(快速参考)
三大支柱
| 关注点 |
定义 |
关键问题 |
| 可靠性 |
系统在故障下正常工作 |
当出现故障时会发生什么? |
| 可扩展性 |
优雅地处理增长 |
10倍负载是什么样子? |
| 可维护性 |
易于操作和发展 |
新工程师能理解这个吗? |
数据模型选择
| 模型 |
最适合 |
避免情况 |
| 关系型 |
多对多关系、连接、一致性 |
高度分层数据、常量模式更改 |
| 文档型 |
自包含文档、树结构 |
需要连接、多对多 |
| 图型 |
高度连接的数据、递归查询 |
简单CRUD、无关系遍历 |
OLTP vs OLAP
| 方面 |
OLTP |
OLAP |
| 查询模式 |
点查找、少数行 |
聚合、多行 |
| 优化 |
索引WHERE中使用的所有内容 |
较少索引、全扫描OK |
| 存储 |
行导向 |
考虑列导向 |
索引类型快速参考
| 类型 |
用例 |
PostgreSQL |
| B-树 |
相等、范围、排序 |
默认、大多数查询 |
| 哈希 |
仅相等 |
精确匹配更快 |
| GIN |
数组、JSONB、全文 |
@>, @@操作符 |
| GiST |
几何、范围类型 |
PostGIS、最近邻 |
| BRIN |
大表、自然有序 |
时间序列数据 |
隔离级别
| 级别 |
预防 |
PostgreSQL默认? |
| 读已提交 |
脏读 |
是 |
| 可重复读 |
+ 不可重复读 |
否 |
| 序列化 |
所有异常 |
否(使用SSI) |
设计检查清单
在最终确定数据架构之前:
- [ ] 识别负载参数(读/写比例、数据量、延迟要求)
- [ ] 选择合适的数据模型(关系/文档/图混合?)
- [ ] 先规范化到3NF,仅在有测量理由时反规范化
- [ ] 为实际查询模式设计索引(非假设)
- [ ] 考虑10倍增长场景
- [ ] 建立隔离级别要求
- [ ] 定义业务逻辑所在位置(应用 vs DB vs 两者)
- [ ] 规划运维(备份、监控、迁移)
参考
- Kleppmann, M. 设计数据密集型应用(O’Reilly, 2017)
- Fontaine, D. PostgreSQL的艺术(2nd ed., 2020)
- Dombrovskaya, H., Novikov, B., Bailliekova, A. PostgreSQL查询优化(Apress, 2021)