关系型 vs 非关系型:区别、用途与选型
关系型 vs 非关系型:区别、用途与选型
项目里同时用了 MySQL、Redis,最近又在调研 MongoDB,被问"区别是什么"时总答得零散,系统整理一遍。
关系型数据库(RDBMS)
代表:MySQL、PostgreSQL、Oracle、SQLite。数据存进二维表,行和列结构固定,表与表之间靠外键关联。
CREATE TABLE posts (
id INTEGER PRIMARY KEY,
title VARCHAR(200) NOT NULL,
category_id INTEGER REFERENCES categories(id)
);
特点:
- 结构化 Schema:字段事先定义,写入要符合规范,改表结构成本高
- SQL 查询:支持复杂的多表 JOIN、聚合
- 强事务 ACID:原子性、一致性、隔离性、持久性,转账类场景必备
- 垂直扩展为主(升级单机配置)
非关系型数据库(NoSQL)
NoSQL 不是一种数据库,而是四类的统称:
| 类型 | 代表 | 数据模型 |
|---|---|---|
| 键值(KV) | Redis、Memcached | key → value,极快 |
| 文档型 | MongoDB、CouchDB | JSON/BSON 文档,结构灵活 |
| 列存储 | Cassandra、HBase | 按列族存,适合海量分析 |
| 图数据库 | Neo4j | 节点+边,关系网络 |
// MongoDB:同一集合里两篇文档字段都可以不同
db.posts.insertOne({ title: 'a', tags: ['js'], cover: { url: 'x.jpg' } })
db.posts.insertOne({ title: 'b', summary: '纯文本' })
特点:Schema 灵活、字段可随时变;天然适合水平扩展(分片);多数事务能力弱或只保证单行/单文档原子性。
核心区别对照
| 维度 | 关系型 | 非关系型 |
|---|---|---|
| 数据结构 | 表,强 Schema | 文档/KV/列/图,弱 Schema |
| 查询 | SQL,复杂 JOIN | 各自 API/查询语言,少 JOIN |
| 事务 | 完善 ACID | 多数较弱,部分支持 |
| 扩展 | 垂直为主 | 水平分片友好 |
| 适合数据 | 关系明确、结构稳定 | 结构多变、海量、高并发 |
怎么选
- 订单、账户、库存等数据一致性要求高、关系复杂 → 关系型
- 缓存、会话、排行榜、计数器 → Redis
- 日志、内容管理、结构频繁变化的业务数据、快速迭代的原型 → MongoDB
- 真实架构往往是搭配使用:MySQL 存核心数据,Redis 扛读并发,ES/Mongo 处理搜索和多变内容——不是二选一,而是各取所长
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~