DynamoDB vs MySQL
选型;CodeRoadMap cf_track 留在 MySQL。
25 分钟
DynamoDB vs MySQL
选型不是「谁更好」,而是 访问模式、运维模型、团队技能 的匹配。CodeRoadMap 明确:MySQL cf_track 为权威,DynamoDB 为 AWS Serverless 实验补充。
学习目标
- 从数据模型、查询、事务、成本四维度对比
- 列出 DynamoDB 适合/不适合的业务
- 巩固 cf_track 留 MySQL 的架构决策
核心内容
四维对比
| 维度 | MySQL(sql-essentials) | DynamoDB |
|---|---|---|
| 模型 | 规范化表 + JOIN | 反规范化单表 + PK/SK |
| 查询 | 任意 SQL、ad-hoc 报表 | 预设计 Query/GSI |
| 事务 | 多行 ACID、隔离级别 | TransactWriteItems(限 25 项) |
| 扩展 | 垂直扩展、读写分离、分库 | 分区自动扩展 |
| 运维 | 自建/RDS 补丁备份 | 全托管 Serverless |
| 成本 | 实例固定 + 存储 | 按请求/容量,Scan 贵 |
cf_track 为何留 MySQL
-- 典型权威查询:多表 JOIN + 排序 + 分页
SELECT t.slug, t.title, COUNT(l.id) AS lesson_count
FROM cf_track t
LEFT JOIN cf_lesson l ON l.track_id = t.id
WHERE t.published = 1
GROUP BY t.id
ORDER BY t.updated_at DESC
LIMIT 20 OFFSET 0;
DynamoDB 无 JOIN/GROUP BY;镜像到 DynamoDB 需 预聚合 + 多 GSI,维护成本高,且与 JPA/orm-essentials 栈不一致。
何时引入 DynamoDB
| 场景 | 推荐 |
|---|---|
| 课程列表、订单、用户账号 | MySQL |
| Serverless 实验 API、会话、进度缓存 | DynamoDB |
| 灵活文档、评论日志 | MongoDB(mongodb-essentials) |
| 复杂报表、BI | PostgreSQL 只读(postgresql-essentials) |
| 纯 AWS Lambda 微服务 | DynamoDB + aws-essentials |
混合架构
Spring Boot 单体
├─ JPA → MySQL(cf_track、cf_lesson、cf_user)
└─ DynamoDbEnhancedClient → UserProgress(实验/高 QPS)
未来 Serverless 分支
API Gateway → Lambda → DynamoDB(不迁移 cf_track)