跳到主要内容

SQL vs NoSQL

问题

SQL 和 NoSQL 数据库有什么区别?如何选型?

答案

核心对比

维度SQL(关系型)NoSQL(非关系型)
代表MySQL、PostgreSQLMongoDB、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 为什么快?

答案

  1. 内存存储:数据读写在内存中完成
  2. 单线程模型:避免上下文切换和锁竞争
  3. IO 多路复用:epoll 处理并发连接
  4. 高效数据结构:跳表、哈希表等优化实现

Q3: 什么时候不该用 NoSQL?

答案

  • 需要复杂事务(如转账)
  • 需要复杂 JOIN 查询
  • 数据一致性要求极高
  • 已有成熟的 SQL 团队和基础设施

Q4: 如何做 SQL 到 NoSQL 的数据迁移?

答案

  1. 反范式化:将关联表合并为嵌套文档
  2. 双写过渡:同时写 SQL 和 NoSQL,对比数据
  3. 增量迁移:先迁历史数据,再切换写入

相关链接