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