快速认识
很多人做项目选数据库时,会先问一句:"现在到底该用 SQL 还是 NoSQL?"这个问题听起来像在二选一,实际却把两个不同层级的概念放在了一起。
SQL 通常指使用关系模型和结构化查询语言的一类数据库;NoSQL 不是某一种数据库,而是键值、文档、宽列、图和搜索等非关系型系统的统称。它们之间的差别不只是"有没有表",还包括数据模型、查询方式、事务能力、扩展方式和一致性取舍。
一句话结论
应该先根据数据关系、访问模式、一致性要求和扩展规模选择数据模型,再选择具体产品;SQL 和 NoSQL 可以互补,不能只靠一句"大项目用 NoSQL,小项目用 MySQL"决定。
先记住这几点
- SQL 数据库的优势是关系建模、约束、连接、事务和成熟的查询优化,适合结构相对稳定、关系复杂、需要强一致性的业务。
- NoSQL 的优势通常在特定访问路径、水平扩展或灵活数据结构上,例如按键取值、保存整份文档、按地理范围查询或做大文本检索。
- NoSQL 不等于没有查询语言,也不等于都没有事务。 许多产品提供自己的查询语法、二级索引、多文档事务或分布式事务能力,只是能力边界各不相同。
- 真实系统经常组合使用。 MySQL 保存交易和用户核心数据,Redis 做缓存,Elasticsearch 做检索,MongoDB 保存结构多变的文档,这种架构并不矛盾。
如果你只想知道怎么选,先记住"数据模型、访问模式、一致性、扩展方式"这四个词就够了。下面继续拆开 SQL、NoSQL 和不同产品之间的边界。
拓展
1. 先把三个概念分清
SQL 是 Structured Query Language,即结构化查询语言。日常说"SQL 数据库"时,通常指关系型数据库(Relational Database,RDBMS),例如 PostgreSQL、MySQL、Oracle 和 SQL Server。
关系模型把数据组织成表、行和列,通过主键、外键和约束描述数据关系。它擅长表达"哪些数据必须一起成立",例如订单必须属于一个用户、库存不能变成负数、转账两边的余额必须同时变化。
NoSQL 最初常被解释为 Not Only SQL,也就是"不只是 SQL"。这个名称覆盖的范围很广:
| 类型 | 典型产品 | 数据组织方式 | 常见优势场景 |
|---|---|---|---|
| 键值数据库 | Redis、Memcached | Key 到 Value | 缓存、会话、计数器、排行榜 |
| 文档数据库 | MongoDB | JSON/BSON 文档 | 结构可变、聚合读取、内容管理 |
| 宽列数据库 | Cassandra、HBase | 行键和列族 | 大规模写入、按分区键访问 |
| 图数据库 | Neo4j | 节点和关系 | 社交关系、路径和关联分析 |
| 搜索引擎 | Elasticsearch、OpenSearch | 倒排索引和文档 | 全文检索、过滤、聚合分析 |
所以"MongoDB 和 Redis 都是 NoSQL,它们能不能互相替代"这个问题的答案通常是否定的。它们虽然都被归入 NoSQL,但数据模型和查询路径完全不同。
2. 真正的区别在哪些维度
不能只用"是否关系型"比较数据库。更有用的做法是拆成多个维度:
| 维度 | 关系型数据库 | 常见 NoSQL 系统 | 需要追问的问题 |
|---|---|---|---|
| 数据模型 | 表、行、列、关系 | 键值、文档、列族、图等 | 业务数据天然是什么形状 |
| 查询方式 | SQL、连接、聚合 | API、专用查询语言、索引 | 最常见查询是否固定 |
| 一致性 | 通常以 ACID 事务为核心 | 不同产品支持范围差异很大 | 能否接受短暂不一致 |
| 扩展方式 | 纵向扩展为主,也可分片 | 常重视水平扩展 | 增长的是数据、读写还是并发 |
| 结构变化 | 通过迁移调整表结构 | 文档或键值结构更灵活 | 灵活是否真的能降低复杂度 |
| 关系处理 | 连接和约束成熟 | 常通过嵌套或反范式化处理 | 关系是否会持续变化 |
关系型数据库强调 ACID:
- Atomicity:原子性,事务里的操作要么都成功,要么都失败。
- Consistency:一致性,事务执行前后满足约束。
- Isolation:隔离性,并发事务之间按隔离级别相互影响。
- Durability:持久性,提交后的结果在故障恢复后仍然存在。
NoSQL 经常提到 BASE、最终一致性或可调一致性,但这些都不是所有 NoSQL 产品的统一标准。Redis、MongoDB、Cassandra 和 Elasticsearch 在事务、复制、持久化和一致性上的差异,比它们"都属于 NoSQL"这件事更重要。
3. 为什么"表结构固定"不一定是缺点
初学者常把关系型数据库的表结构理解成束缚,觉得文档数据库想加字段就加字段更自由。自由确实有价值,但结构稳定也有明显收益。
表结构、类型和约束可以把一部分错误挡在写入之前。数据库知道用户 ID 不能为空、订单金额必须是数字、外键指向哪张表,查询优化器也更容易估计数据分布并选择执行计划。
文档数据库允许同一集合里的文档拥有不同字段,适合商品参数、表单配置和内容卡片这类变化频繁的数据。代价是应用层要承担更多结构校验,历史文档版本也需要兼容,否则字段越加越多后,查询和代码会一起失控。
因此"灵活"不是免费能力。它把数据库的结构责任部分交给了应用代码,适合变化快、以整体文档读取为主的场景,不代表所有业务都应该采用。
4. NoSQL 为什么常被说成更容易扩展
许多 NoSQL 系统从一开始就更强调分布式部署和水平扩展:增加节点,把数据和请求分散到更多机器上。宽列数据库常按分区键切分数据,键值数据库常按 Key 分片,搜索系统也天然使用分片和副本。
关系型数据库同样可以分库分表、读写分离和部署分布式集群,只是应用可能需要处理路由、跨分片连接、分布式事务和全局唯一 ID 等问题。
这里真正影响架构的不是"SQL 还是 NoSQL",而是数据能否按某个稳定维度切开:
- 按用户 ID 分片,查询用户订单很方便,但全局排行榜可能要聚合所有分片。
- 按订单 ID 分片,订单明细容易聚合,但按商户查询可能需要额外索引表。
- 跨分片事务、唯一约束和关联查询,通常比单机事务复杂。
选择分片键,本质上是在选择最重要的访问路径,同时接受其他查询变慢。
5. 一个实际选择流程
可以按下面五步判断,而不是先决定数据库品牌:
- 先画数据关系。 用户、订单、支付和库存之间是否大量关联?是否需要约束和跨实体一致性?
- 列出关键访问路径。 是主键查询、范围查询、全文检索,还是多条件组合分析?每条路径每天大约执行多少次?
- 确认一致性要求。 余额、订单状态和库存通常不能接受任意陈旧数据;点赞数、浏览量和推荐结果可能允许短暂延迟。
- 估算规模和增长。 数据量、吞吐量和增长曲线是否已经超过单机数据库的可靠范围?
- 用一个可验证实验比较。 建真实表结构和索引,导入接近真实分布的数据,执行代表查询并记录延迟、吞吐和资源占用。
不要用一张只有几百行的测试表证明某种数据库"性能更强"。数据分布、索引命中率、缓存、网络往返和并发模型都会改变结果。
6. 常见架构不是二选一
一个内容社区可以采用下面的组合:
| 数据或能力 | 更常见的选择 | 原因 |
|---|---|---|
| 用户、订单、支付记录 | 关系型数据库 | 需要事务、约束和可靠关联 |
| 热门文章缓存 | Redis | 按 Key 高频读取,数据可重建 |
| 文章全文检索 | Elasticsearch | 倒排索引适合关键词和相关性排序 |
| 评论或内容快照 | MongoDB 或关系型 JSON 字段 | 结构可能变化,常按整体读取 |
| 社交关系分析 | 图数据库 | 多跳关系和路径查询更自然 |
组合使用也会带来新问题:缓存与数据库如何同步、搜索索引延迟多少、消息重复消费怎么办、跨存储如何保证最终一致。NoSQL 并没有消灭分布式复杂度,只是把复杂度转移到了更具体的层面。
7. 六个常见误区
- NoSQL 就是没有 SQL。 很多产品支持类 SQL 查询、SQL 接口或结构化查询语言,关键差别在数据模型和系统能力。
- NoSQL 一定更快。 速度取决于查询能否命中主键、分区键或索引,也取决于一致性、网络和数据分布。
- 关系型数据库不能存海量数据。 单机有边界,但关系型系统也可以通过分区、分片、副本和列式存储扩展,只是架构成本不同。
- 文档数据库不需要设计结构。 它允许结构变化,但应用仍然需要版本、校验和索引设计,否则会出现难以清理的历史数据。
- ACID 和可用性永远无法同时获得。 分布式系统确实存在一致性、可用性和分区容错之间的取舍,但现实中还有事务范围、延迟、隔离级别和故障模型等更多维度,不能把 CAP 简化成一句产品宣传。
- 技术选型只由数据量决定。 团队熟悉度、运维能力、备份恢复、监控、生态和成本同样重要。一个不会可靠运维的系统,即使理论吞吐更高,也不一定适合业务。
8. 面试时可以怎么回答
如果面试官问"SQL 和 NoSQL 怎么选",可以从结论开始:
我会先看数据模型和访问路径。如果实体关系复杂、需要约束和跨表事务,优先考虑关系型数据库;如果核心访问是按 Key、文档聚合、全文检索或超大规模分区写入,会评估对应类型的 NoSQL。很多系统会组合使用,而不是完全替换。
继续追问时,通常会落到:
- 为什么这里不用 MongoDB,而用 MySQL?
- 选择这个分片键后,哪些查询会跨分片?
- 允许最终一致后,用户会看到什么异常状态?
- 缓存、索引和主库之间如何补偿?
回答时要讲业务约束和失败路径,不要只说"NoSQL 扩展性好"。
总结
总结一下:
- SQL 通常描述关系模型和查询语言;NoSQL 是多种非关系型数据库的统称,不是一种产品。
- 真正要比较的是数据模型、访问模式、事务与一致性、扩展方式和运维成本。
- 关系型数据库擅长约束、关联和强事务;NoSQL 常在特定查询路径、水平扩展和灵活结构上有优势。
- 现代系统经常组合使用多种存储,选型的关键是让数据和查询匹配,而不是追求统一品牌。
如果让我在新项目里做选择,我会先用关系型数据库建立清晰的数据边界,等到查询模式和数据规模被真实测量后,再为缓存、检索或高吞吐写入引入合适的专用存储。
参考
- PostgreSQL: What Is PostgreSQL?
- PostgreSQL: Transactions
- MongoDB Manual
- Redis Data Types
- MySQL 8.4 Reference Manual: Introduction
标签:SQL、NoSQL、数据库选型、关系型数据库、系统设计