SQL vs NoSQL
问题
SQL 和 NoSQL 数据库有什么区别?如何选型?
答案
核心对比
| 维度 | SQL(关系型) | NoSQL(非关系型) |
|---|---|---|
| 代表 | MySQL、PostgreSQL | MongoDB、Redis、DynamoDB |
| 数据模型 | 表(行+列) | 文档/键值/列族/图 |
| Schema | 强 Schema(先建表) | 灵活 Schema |
| 查询 | SQL 语言 | 各自 API |
| 事务 | ACID 完整支持 | 部分支持(MongoDB 4.0+) |
| 扩展方式 | 垂直扩展为主 | 水平扩展天然支持 |
| JOIN | 支持复杂关联 | 通常不支持或很弱 |
| 一致性 | 强一致性 | 最终一致性为主 |
NoSQL 四大类型
选型决策
selection-guide.ts
// 选 SQL 的场景
const useSql = {
复杂查询: 'JOIN、聚合、子查询多',
事务要求: '金融、电商订单等强一致场景',
数据结构稳定: '表结构变更不频繁',
关系复杂: '多表关联关系多',
};
// 选 NoSQL 的场景
const useNosql = {
Schema灵活: '数据结构频繁变化',
高并发读写: '每秒万级以上 QPS',
海量数据: '单表亿级以上数据',
快速迭代: '敏捷开发、快速上线',
};
// 混合使用(很常见)
// MySQL 存核心业务数据 + Redis 做缓存 + MongoDB 存日志
实际项目中
大多数项目会混合使用:SQL 数据库存储核心业务数据(用户、订单),Redis 做缓存和 Session,MongoDB 存储灵活结构的数据(日志、CMS 内容)。
常见面试问题
Q1: MongoDB 适合什么场景?
答案:
- 内容管理系统(CMS):文章结构不固定
- 日志收集:写多读少、Schema 灵活
- 用户画像:字段随业务演化
- 快速原型开发:不需要预定义 Schema
Q2: Redis 为什么快?
答案:
- 内存存储:数据读写在内存中完成
- 单线程模型:避免上下文切换和锁竞争
- IO 多路复用:epoll 处理并发连接
- 高效数据结构:跳表、哈希表等优化实现
Q3: 什么时候不该用 NoSQL?
答案:
- 需要复杂事务(如转账)
- 需要复杂 JOIN 查询
- 数据一致性要求极高
- 已有成熟的 SQL 团队和基础设施
Q4: 如何做 SQL 到 NoSQL 的数据迁移?
答案:
- 反范式化:将关联表合并为嵌套文档
- 双写过渡:同时写 SQL 和 NoSQL,对比数据
- 增量迁移:先迁历史数据,再切换写入
相关链接
- MySQL 基础与查询 - SQL 详解
- MongoDB 基础 - MongoDB 详解
- Redis 基础 - Redis 详解