logo
Database Design

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-vs-nosql

  • SQL:强 consistency、复杂 query 能力、transaction 友好;但 horizontal scaling 难度高
  • NoSQL:schema 灵活、scale-out 友好、读写性能好;但 ACID / joins 能力可能受限

示例

  • 银行/支付:SQL 更适合 transaction 与一致性
  • 高写入/多样化数据:NoSQL 更好做快速迭代和 scale

相关练习题

SQL 还是 NoSQL

暂无相关练习题