SQL数据库和非SQL数据库

一句话先记住

SQL 数据库 = 结构固定、强一致、事务可靠
NoSQL 数据库 = 结构灵活、易扩展、高并发


一、SQL 数据库(关系型数据库)

代表

  • MySQL
  • PostgreSQL
  • Oracle
  • SQL Server
  • SQLite

核心特点

  1. 表结构固定

    • 必须先建表(字段、类型、约束)
    • 数据必须符合表结构
  2. 强事务(ACID)

    • 原子性(Atomicity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)
  3. 用 SQL 语言操作

sql 复制代码
SELECT * FROM file_meta WHERE file_sha1 = 'xxx';
  1. 支持复杂查询 & 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

核心特点

  1. 结构灵活

    • 不需要预定义 schema
    • 同一个集合里字段可以不一样
  2. 天然适合分布式

    • 水平扩展(加机器)
  3. 高并发性能好

    • 写入速度快
    • 非常适合缓存/日志/实时数据
  4. 弱事务(大多)

    • 多数 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 数据库适合高并发、可扩展和非结构化数据场景;
实际系统通常两者结合使用。

相关推荐
Anastasiozzzz1 天前
深度解析 AI 时代的“TCP/IP协议”:Agent-to-Agent (A2A) 通信架构与多智能体协同底层逻辑
大数据·开发语言·网络·数据库·网络协议·tcp/ip·架构
wang3zc1 天前
如何设置密码复杂度策略以约束MongoDB用户的密码强度
jvm·数据库·python
杨云龙UP1 天前
一次 Oracle 11g 异常不可用排查:从 ORA-01034 到磁盘 I/O 故障定位_2026-05-17
运维·数据库·windows·sql·oracle·centos
谪星·阿凯1 天前
渗透测试之数据库提权全指南
数据库·网络安全
weelinking1 天前
【2026】08_Claude与版本控制:Git协作技巧
数据库·人工智能·git·python·数据挖掘·交互·cloudera
黄焖鸡能干四碗1 天前
固定资产管理系统建设方案和源码(Java源码)
大数据·数据库·人工智能·物联网·区块链
JoneBB1 天前
ABAP Webservice连接
运维·开发语言·数据库·学习
解决问题no解决代码问题1 天前
从乱码到脱敏导出:TiDB CSV 导出实战全指南
数据库
未若君雅裁1 天前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
2401_867623981 天前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python