ADR-001

使用 AWS RDS PostgreSQL 作为主数据库

取代自建 MongoDB 与自建 MySQL — SaaS 多租户 OLTP 主存储决策
Accepted
决策日期 2026‑05‑15
作者 Platform 团队
时间盒 2 周 deliberation
01 Context · 决策背景

我们正在构建一个多租户 SaaS 产品(B2B 运营平台),当前 MVP 阶段使用单体 PostgreSQL 自建实例。随着以下变化,主数据库选型需要做出正式决策:

  • 业务复杂度持续增长 — 核心领域模型涉及用户/租户/订单/订阅/审计等 8+ 聚合根,跨表 JOIN 查询频繁(平均每条业务请求触发 3–7 个 JOIN);
  • 数据一致性要求高 — 计费、订阅状态变更、租户配额扣减均要求 ACID 事务,不允许最终一致性窗口;
  • 即将进入规模化阶段 — 预计未来 12 个月租户数从 20 增长至 500+,数据库写入 QPS 从 200 增长至 ~2,000;
  • 运维资源有限 — 团队 5 名后端工程师,PostgreSQL 经验 3+ 年,MongoDB 运维经验为零;无专职 DBA;
  • 合规需求 — 需支持 SOC 2 Type II 审计,要求所有数据变更可追溯(行级审计日志)。

我们需要在 PostgreSQL / MongoDB / MySQL 三者中选择一个作为主数据库,并在 2 周 deliberation 内完成决策。

02 Decision · 决策
We decide
使用 AWS RDS for PostgreSQL 16(Multi-AZ 部署,db.r6g.xlarge 起步)作为主 OLTP 数据库。
不采用自建 MongoDB(含 MongoDB Atlas)或自建 MySQL。

决策理由:

  • 关系模型匹配业务 — 8+ 聚合根、频繁 JOIN、ACID 事务是典型的关系型负载,PostgreSQL 在此场景下性能与正确性均优于文档数据库;
  • 团队能力匹配 — 全团队 PostgreSQL 3+ 年生产经验,能独立完成 schema 设计、查询优化、备份恢复,MongoDB 从零学习 + 试错成本估计 6–8 周;
  • 托管服务降运维负担 — AWS RDS 提供自动备份(Point-in-Time Recovery)、自动补丁、Multi-AZ 故障切换、存储自动扩容,将运维负担从「自建需 1 人全职」降至「0.2 人兼职」;
  • 生态成熟 — pgAudit(审计日志)、pg_stat_statements(慢查询)、PostGIS(未来可能地理位置需求)、TimescaleDB(时序指标)均可零成本接入;
  • 可逆性可控 — 使用标准 ANSI SQL + pg_dump 导出,迁移至 MySQL 或 CockroachDB 的成本在可控范围内(见 §5 可逆性评估)。
03 Consequences · 后果

✅ 正面后果

  • 团队零学习成本,上线速度最快 — 现有 schema migration 工具链(Flyway + SQL)直接复用;
  • AWS RDS 自动运维(备份/补丁/故障转移),运维人力节省约 0.8 FTE;
  • ACID + SERIALIZABLE 隔离级别满足计费/订阅场景的强一致性要求;
  • pgAudit 原生支持 SOC 2 行级审计日志,无需额外中间件;
  • PostgreSQL 扩展生态(PostGIS / pgvector / TimescaleDB)为未来需求预留空间。

⚠️ 负面后果

  • 水平扩展(sharding)不如 MongoDB 原生支持成熟 — 若未来写入 QPS 突破 10,000,需要引入 Citus 或应用层分片,增加架构复杂度;
  • Schema 变更需要显式 migration(Flyway),无法像 MongoDB 那样无 schema 快速迭代字段;
  • AWS RDS Multi-AZ 费用约 $0.50–0.80/小时(db.r6g.xlarge),年度成本约 $4,500–7,000,高于自建但低于 MongoDB Atlas 同级实例;
  • JSON 查询能力(jsonb 类型)虽成熟,但在深度嵌套文档的频繁部分更新场景下性能不及 MongoDB 原生 BSON。

⚪ 中性后果

  • 团队需要在 3 个月内完成从自建 PostgreSQL 到 AWS RDS 的迁移(预计 2 周 downtime 窗口);
  • ORM(Prisma)同时支持 PostgreSQL 与 MySQL,切换无代码层障碍,但 MongoDB 需换用 Mongoose 或 Prisma MongoDB connector。
04 Alternatives Considered · 备选方案
维度 AWS RDS PostgreSQL 16 自建 MongoDB 7 (Atlas M30) 自建 MySQL 8.0
查询性能
复杂 JOIN / 子查询 / 聚合
★★★★★ 原生优化器,JOIN 效率最高;支持 CTE、窗口函数、部分索引;jsonb GIN 索引兼顾文档查询。 ★★☆☆☆ 无跨集合 JOIN;$lookup 等同于左外连接但性能远低于 SQL JOIN;聚合管道复杂查询可读性差。 ★★★★☆ JOIN 性能良好但不支持部分索引、CTE 递归不如 PG;缺少 jsonb 等价类型,JSON 函数较弱。
年度成本
含运维人力
★★★★☆ RDS Multi-AZ ~$5,500/年 + 0.2 FTE 运维 = 总计 ~$8,500/年。性价比最优。 ★★☆☆☆ Atlas M30 ~$6,800/年 + 学习曲线 6–8 周 (~$15,000 机会成本) + 持续运维 0.3 FTE。首年真实成本 ~$20,000+。 ★★★☆☆ 自建 EC2 ~$2,000/年 但需 0.5 FTE 运维 ~$25,000/年。总计 ~$27,000/年。无托管服务自动化。
团队熟悉度
上手速度 & 排障能力
★★★★★ 全团队 3+ 年生产经验。所有成员能独立进行 schema 设计、查询优化、备份恢复。 ★☆☆☆☆ 零运维经验。需要学习 replica set 选举、oplog、sharding key 设计、聚合管道优化。生产事故响应能力不足。 ★★★☆☆ 2 人有 MySQL 经验但未达专家级。InnoDB 调优、binlog 复制、字符集问题存在知识盲区。
生态与工具链
扩展/监控/审计/ORM
★★★★★ pgAudit + pg_stat_statements + PostGIS + pgvector + TimescaleDB + Flyway + Prisma。SOC 2 审计开箱即用。 ★★★☆☆ Atlas 自带监控但审计需付费企业版。变更流 (Change Streams) 强于 PG 逻辑复制但生态广度不如 PG 扩展。 ★★★☆☆ Percona Toolkit + pt-query-digest 成熟,但扩展生态不如 PG。审计插件(MariaDB Audit Plugin)需单独配置。
长期演进
5 年可扩展性
★★★★★ Citus 水平分片成熟;CockroachDB 兼容 PG wire protocol 作为逃生舱;AWS RDS 升级路径清晰(PG 16 → 17 → 18)。 ★★★☆☆ 原生 sharding 优秀但被 MongoDB 官方推荐 Atlas 锁定。自建 sharding 运维复杂度极高。许可证 SSPL 存在合规风险。 ★★★☆☆ Vitess / TiDB 分片方案成熟但需要额外学习。MySQL 8.0 被 Oracle 掌控路线,社区 fork(MariaDB)存在分裂风险。

MongoDB 未被选择的原因:

  • 业务核心负载是关系型查询(JOIN / 子查询 / 聚合),MongoDB 的文档模型在数据一致性、跨集合查询和 ACID 多文档事务方面是反模式;
  • 团队零运维经验 → 生产事故风险不可接受(若 replica set 脑裂、oplog 溢出无法自主排障);
  • SSPL 许可证对 SaaS 场景有法律不确定性。

MySQL 未被选择的原因:

  • PostgreSQL 在所有 5 个维度上均等于或优于 MySQL,已知团队 Postgres 经验更深;
  • MySQL 的 JSON 函数、CTE(8.0 才支持)、部分索引等特性弱于 PostgreSQL,未来业务复杂度可能被迫绕过;
  • PostgreSQL 扩展生态(pgAudit / pgvector / TimescaleDB)对应明确的近期需求,MySQL 无等价能力。
Reversibility Assessment
Two-way Door · 中等可逆
该决策可在 6 个月内回退,但需要承担迁移成本。 使用标准 ANSI SQL 与 pg_dump 可将 schema + 数据完整导出为 SQL 文件。 AWS DMS (Database Migration Service) 支持从 PostgreSQL 到 MySQL/Aurora 的在线迁移(CDC 模式),预计迁移窗口 2–4 周。 回退成本估计:1–2 人月工程投入 + 1 周 downtime。

不可逆部分:应用层 ORM 代码中的 PG 特有能力(jsonb 操作符、pgcrypto、PostGIS 空间查询)若深度使用后将增加迁移难度。 建议在 DAO 层封装 PG 特定语法,保持迁移端口。
Decision Review Checkpoint
2026‑11‑15 · 6 个月后检讨
检讨触发条件(满足任一即启动 review):
① 写入 QPS 稳定突破 5,000(接近 RDS db.r6g.xlarge 单实例上限)
② 出现超过 3 个需要文档模型(无固定 schema)的业务场景
③ 团队新增 MongoDB 经验成员 ≥ 2 人
④ AWS RDS 年度费用突破 $10,000 且自建方案性价比明显提高

检讨议程:重新评估 PostgreSQL 是否仍为最优解;审议 MongoDB 作为辅助数据库(多库架构);确认 Citus / CockroachDB 逃生路径的准备状况。
本页面由 办一下|banyixia.com AI 生成