一句话先记住
SQL 数据库 = 结构固定、强一致、事务可靠
NoSQL 数据库 = 结构灵活、易扩展、高并发
一、SQL 数据库(关系型数据库)
代表
- MySQL
- PostgreSQL
- Oracle
- SQL Server
- SQLite
核心特点
-
表结构固定
- 必须先建表(字段、类型、约束)
- 数据必须符合表结构
-
强事务(ACID)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
-
用 SQL 语言操作
sql
SELECT * FROM file_meta WHERE file_sha1 = 'xxx';
- 支持复杂查询 & Join
sql
SELECT u.name, f.filename
FROM user u
JOIN file f ON u.id = f.user_id;
优点
- 数据一致性强
- 事务可靠
- 适合复杂关系
- 金融/订单/账务系统首选
缺点
- 扩展困难(主要是纵向扩展)
- 高并发写入性能有限
- 表结构改动成本高
二、NoSQL 数据库(非关系型)
NoSQL ≠ 不支持 SQL
而是 Not Only SQL
常见分类 & 代表
1️⃣ Key-Value
- Redis
- Memcached
text
key -> value
2️⃣ 文档型
- MongoDB
- CouchDB
json
{
"file_sha1": "xxx",
"filename": "a.png",
"size": 12345
}
3️⃣ 列存储
- HBase
- Cassandra
4️⃣ 图数据库
- Neo4j
核心特点
-
结构灵活
- 不需要预定义 schema
- 同一个集合里字段可以不一样
-
天然适合分布式
- 水平扩展(加机器)
-
高并发性能好
- 写入速度快
- 非常适合缓存/日志/实时数据
-
弱事务(大多)
- 多数 NoSQL 只保证最终一致性
优点
- 扩展性极强
- 高并发
- 开发灵活
- 适合大数据量
缺点
- 事务能力弱
- 复杂查询能力差
- 数据一致性要自己设计
三、用你现在的「文件系统项目」来对比(非常关键)
你现在用的是:
go
map[string]FileMeta
这是:
内存型 Key-Value NoSQL(最简版)
如果用 SQL 数据库(MySQL)
表设计:
sql
CREATE TABLE file_meta (
file_sha1 VARCHAR(40) PRIMARY KEY,
file_name VARCHAR(255),
file_size BIGINT,
location VARCHAR(512),
upload_at DATETIME
);
优点:
- 数据持久化
- 重启不丢
- 支持查询、排序
如果用 NoSQL(MongoDB)
文档结构:
json
{
"file_sha1": "xxx",
"file_name": "a.png",
"size": 12345,
"location": "...",
"upload_at": "2026-01-01"
}
优点:
- 结构随便加字段
- 扩展性好
- 写入速度快
实际工程常见做法(重要)
SQL + NoSQL 混合使用
| 场景 | 用什么 |
|---|---|
| 用户、订单、账务 | SQL |
| 文件元信息 | SQL |
| 文件秒传去重 | Redis |
| 文件缓存 | Redis |
| 日志 | NoSQL |
四、什么时候该选哪个?(决策表)
| 需求 | 推荐 |
|---|---|
| 强一致、事务 | SQL |
| 高并发、缓存 | NoSQL |
| 数据结构经常变 | NoSQL |
| 复杂查询 | SQL |
| 分布式 | NoSQL |
| 学习/原型 | NoSQL |
五、面试级总结(你可以直接背)
SQL 数据库适合结构化数据和强事务场景;
NoSQL 数据库适合高并发、可扩展和非结构化数据场景;
实际系统通常两者结合使用。