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

相关推荐
艾莉丝努力练剑17 小时前
【Linux进程间通信:共享内存】为什么共享内存的 key 值由用户设置
java·linux·运维·服务器·开发语言·数据库·mysql
悲伤小伞18 小时前
Git_原理及使用_撤销修改_删除文件
数据库·git
fengxin_rou18 小时前
一文读懂 Redis 集群:从哈希槽到透明访问
java·数据库·redis·算法·spring·缓存
m0_6356474818 小时前
Qt开发与MySQL数据库教程(二)——MySQL常用命令以及示例
java·开发语言·数据库·mysql
顶点多余18 小时前
数据库——对表的操作
数据库
程序员榴莲18 小时前
MySQL (一):MySQL的安装与启动
数据库·mysql
咖啡の猫18 小时前
Redis 通用命令
数据库·redis·bootstrap
IT界的老黄牛18 小时前
【IT老齐230 笔记 + 思考】金融业容灾方案“两地三中心“是什么意思?
数据库·笔记·架构
aiAIman18 小时前
OpenClaw 用户必修课:(三)Claude Code 单一聊天原则、Hooks 与 LSP
数据库·人工智能·开源·aigc
oradh19 小时前
Oracle单库环境下计划内启停数据库的步骤
数据库·oracle