SQL 还是 NoSQL
选择 SQL / NoSQL 的指南与权衡
在 database 世界里,主要有两类方案:SQL(relational)和 NoSQL(non-relational)。它们在构建方式、存储信息类型、以及存储方式上都有差异。Relational database 结构化且有预定义 schema;non-relational database 更分布式、非结构化,schema 更动态。
High-level differences
SQL 与 NoSQL 的关键差异:
Storage
SQL 把数据存到 tables:每行是一个 entity,每列是该 entity 的一个 data point。
NoSQL 有多种 storage model,例如 key-value、graph、document 等。
Schema
在 SQL 里,每条记录都必须符合固定 schema,列必须提前设计好,且每行必须包含每个列的数据。Schema 可以后期改,但需要 migrations。
NoSQL 的 schema 更动态。字段可以随时新增,且每条 record 不一定包含每个 field。
Querying
SQL database 用 SQL(structured query language)做定义与操作,表达能力很强。
NoSQL 的 query 通常面向 document collections,不同 database 有不同语法。
Scalability
大多数 SQL database 是 vertical scaling,成本很高。虽然也能做跨多台 server 的扩展,但实现复杂且耗时。
NoSQL database 更适合 horizontal scaling,可以轻松加 servers 处理大流量。便宜的 commodity hardware 或 cloud instances 就能承载 NoSQL;许多 NoSQL 还会自动分布数据。
Reliability
多数 relational databases 符合 ACID,因此在 data reliability 和 transactions 方面更有保障。
NoSQL 方案通常为了 performance 与 scalability,牺牲部分 ACID 保证。
Reasons
选择 SQL 或 NoSQL 取决于需求:
For SQL
- 结构化数据 + 严格 schema
- Relational data
- 需要复杂 joins
- 需要 transactions
- Index lookup 很快
For NoSQL
- Dynamic / flexible schema
- Non-relational data
- 不需要复杂 joins
- 数据量大、写入多
- IOPS 要求极高
Trade-off 快览

- SQL:强 consistency、复杂 query 能力、transaction 友好;但 horizontal scaling 难度高
- NoSQL:schema 灵活、scale-out 友好、读写性能好;但 ACID / joins 能力可能受限
示例
- 银行/支付:SQL 更适合 transaction 与一致性
- 高写入/多样化数据:NoSQL 更好做快速迭代和 scale