下面从核心差异 → 各数据库特点 → 选型对照 → 典型组合用法四个层面,系统对比 关系型(MySQL / PostgreSQL) 与 非关系型(Redis / MongoDB)。
一、核心差异一览表
| 维度 | 关系型(MySQL / PostgreSQL) | 非关系型(Redis / MongoDB) |
|---|---|---|
| 数据模型 | 表(行 + 列),强 Schema | Redis:Key–Value / 数据结构 MongoDB:文档(BSON,弱 Schema) |
| 事务支持 | ✅ ACID,强一致 | Redis:单命令原子;MongoDB:多文档事务(有限) 整体偏最终一致 |
| 关联查询 | ✅ JOIN、子查询 | ❌ 不支持 JOIN,需冗余或应用层处理 |
| 扩展性 | 垂直扩展为主,水平扩展复杂 | ✅ 天生适合水平扩展 |
| 查询能力 | SQL,功能极强 | Redis:简单 KV 查询 MongoDB:类 JSON 查询 |
| 一致性 | 强一致 | 通常最终一致 |
| 延迟 | ms 级 | Redis:μs~ms 级 |
| 典型场景 | 核心业务数据、账务、订单 | 缓存、会话、日志、画像、配置 |
一句话:关系型管“钱和账”,非关系型管“快和大”。
二、关系型数据库:MySQL vs PostgreSQL
MySQL
- 优点
- 生态成熟、资料极多
- 易上手,社区版免费
- InnoDB 稳定可靠
- 缺点
- 复杂 SQL / 窗口函数支持一般
- 扩展性相对弱
- 适用
- Web 业务、电商订单、CMS、中小型系统
- 代表场景
- 用户表、订单表、支付流水
PostgreSQL
- 优点
- “最先进的开源关系型数据库”
- 完整 SQL 支持(CTE、窗口函数、JSONB)
- 扩展性强(GIS、全文检索、自定义类型)
- 缺点
- 学习成本略高
- 高并发简单 KV 场景不如 MySQL 轻量
- 适用
- 复杂业务逻辑、数据分析、地理信息系统
- 代表场景
- 金融系统、ERP、SaaS 平台、GIS 服务
✅ 趋势:新项目如果无历史包袱,PostgreSQL 越来越是首选。
三、非关系型数据库:Redis vs MongoDB
Redis(内存 KV + 数据结构)
- 数据模型
- String / Hash / List / Set / ZSet / Bitmap / HyperLogLog / Stream
- 优点
- 极高性能(10万+ QPS)
- 丰富的数据结构
- 原子操作,支持 Lua 脚本
- 缺点
- 内存成本高
- 不适合做主存储(除非可丢失或可持久化)
- 典型用途
- 缓存
- 分布式锁
- 计数器、排行榜
- 会话存储
- 消息队列(Stream)
📌 原则:Redis = 加速层,不是“唯一数据源”。
MongoDB(文档数据库)
- 数据模型
- BSON 文档(类似 JSON)
- 优点
- Schema 灵活,适合快速迭代
- 天然存对象
- 分片水平扩展
- 缺点
- 事务能力弱于关系型
- JOIN 支持差
- 内存占用高
- 典型用途
- 日志 / 埋点
- 用户画像
- 内容管理(文章、评论)
- IoT 设备数据
📌 原则:MongoDB = 存“变来变去的大对象”。
四、选型决策表(非常实用)
| 业务需求 | 推荐 |
|---|---|
| 需要事务、强一致、钱/账 | MySQL / PostgreSQL |
| 复杂查询、报表、分析 | PostgreSQL |
| 简单 CRUD、高并发读 | MySQL + Redis |
| 缓存、热点数据 | Redis |
| 会话、购物车 | Redis |
| 日志、埋点、监控数据 | MongoDB / Elasticsearch |
| 用户画像、标签系统 | MongoDB |
| 全文搜索 | Elasticsearch(不是 MongoDB) |
| 地理位置 | PostGIS / Redis Geo |
| 超高并发计数 / 排行榜 | Redis |
五、真实系统中的常见组合(重点)
1️⃣ Web 后端经典架构
Client
↓
API Server
↓
Redis(缓存)
↓
MySQL / PostgreSQL(主库)
- Redis:缓存用户信息、配置、Token
- MySQL/PG:订单、账户、权限
2️⃣ 读写分离 + 缓存
写请求 → MySQL
读请求 → Redis → MySQL(未命中)
3️⃣ 冷热数据分离
- MongoDB:存原始日志、历史数据
- MySQL:存核心业务数据
- Redis:存当天热点数据
4️⃣ 订单系统示例
| 数据 | 存储 |
|---|---|
| 订单核心(金额、状态) | PostgreSQL |
| 订单详情快照(商品信息) | MongoDB |
| 订单缓存 / 幂等 Key | Redis |
六、常见误区提醒
❌ 用 MongoDB 替代 MySQL 做核心账务
→ 事务、一致性风险大
❌ 把 Redis 当主数据库
→ 宕机或策略错误可能丢数据
❌ 所有数据都扔 MongoDB 图省事
→ 后期查询复杂、性能下降
❌ MySQL 硬抗高并发只读
→ 不加 Redis,成本极高
七、一句话总结
- MySQL / PostgreSQL:
👉 负责“正确”和“关系” - Redis:
👉 负责“快” - MongoDB:
👉 负责“灵活”和“量大”
没有谁替代谁,只有是否放对位置。