
一句话定义:关系型数据库,就是用二维表组织数据、表与表之间用外键建立关联、用 SQL 统一操作、靠事务保证一致性的数据库。
定义看完就忘,动手做一遍才记得住。这篇文章你跟着敲完,能带走三样东西:一个跑通的关系模型示例、一套验证 ACID 的 SQL、以及「什么时候该用关系型、什么时候不该用」的判断力。最后再补上云上落地要点和避坑清单,把「内容」补完整。
方式一:本地 MySQL。 装好 MySQL 8.0,命令行执行:
mysql -u root -p方式二:云数据库 MySQL。 控制台 5 分钟开通:创建实例 → 配置白名单 → 创建账号和库 → 连接。云数据库把安装、主备、备份都托管了,适合不想碰运维的开发者。
无论哪种,先建一个库,统一用 utf8mb4 字符集(避免中文乱码):
CREATE DATABASE demo_db CHARACTER SET utf8mb4;
USE demo_db;关系型数据库的「表」,可以理解成加强版的 Excel 工作表:行是记录,列是字段。
先建一张用户表:
CREATE TABLE users (
user_id INT PRIMARY KEY, -- 主键:唯一标识一行
name VARCHAR(50),
phone VARCHAR(20),
created_at DATE
);插入两条数据:
INSERT INTO users VALUES
(1001, '张三', '13800000000', '2026-01-01'),
(1002, '李四', '13900000000', '2026-01-02');查一下,确认数据进去了:
SELECT * FROM users;user_id | name | phone | created_at |
|---|---|---|---|
1001 | 张三 | 13800000000 | 2026-01-01 |
1002 | 李四 | 13900000000 | 2026-01-02 |
user_id 是主键:一张表里唯一标识一行记录,不能重复、不能为空。你现在试着再插一条 user_id = 1001 的记录,MySQL 会直接报错拒绝——这就是主键在兜底。
「关系型」三个字里的「关系」,说的不是人际关系,而是表和表之间通过字段建立的关联。这个关联靠外键实现。
建一张订单表,用 user_id 关联回用户表:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键:引用 users 表的主键
);
INSERT INTO orders VALUES (9001, 1001, 299.00);
现在插入一条 user_id = 9999(用户表里不存在)的订单,看看会发生什么:
INSERT INTO orders VALUES (9002, 9999, 100.00);
-- ERROR 1452: Cannot add or update a child row: a foreign key constraint fails报错了。外键在数据库层面保证「订单必须属于一个真实存在的用户」,这就是数据完整性。
用 JOIN 把两张表拼起来查:
SELECT o.order_id, u.name, o.amount
FROM orders o
JOIN users u ON o.user_id = u.user_id;order_id | name | amount |
|---|---|---|
9001 | 张三 | 299.00 |
订单里只存了一个 user_id,用户姓名是从 users 表现查的——数据不重复存储,靠关联拼出完整信息,这就是关系模型的核心。
关系型数据库最值钱的能力,是保证「一组操作要么全成、要么全败」,靠的是事务和 ACID。
建一张账户表:
CREATE TABLE accounts (
account_id VARCHAR(20) PRIMARY KEY,
balance DECIMAL(10,2)
);
INSERT INTO accounts VALUES ('A', 1000), ('B', 1000);验证原子性 + 一致性:A 转 100 给 B,这是两个 UPDATE,必须绑成一个事务:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';
COMMIT;提交后查一下:
SELECT * FROM accounts;account_id | balance |
|---|---|
A | 900 |
B | 1100 |
总额还是 2000,不多不少——这就是原子性(两步一起成)和一致性(总额守恒)。
验证回滚:故意让第二步失败,看会不会「只做一半」:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_id = '不存在的账户';
ROLLBACK;回滚后 A 的余额回到 900(而不是 800),说明第一笔扣款被撤销了,没有出现「扣了没加」的中间状态。持久性则保证 COMMIT 之后的数据断电也不丢;隔离性让并发的事务互不干扰(对应读未提交 / 读已提交 / 可重复读 / 串行化四个隔离级别)。

理解了关系型数据库,再把它和非关系型(NoSQL)放一起看,选型就不纠结了:
维度 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
数据模型 | 二维表(结构化) | 文档 / 键值 / 列 / 图(灵活) |
表结构 | 先定义好 schema | 动态可变 |
查询 | 统一 SQL | 各自 API |
一致性 | 强一致(ACID) | 大多最终一致 |
扩展 | 垂直扩展为主 | 水平扩展为主 |
代表 | MySQL、PostgreSQL、Oracle | MongoDB、Redis、Cassandra |
一句话判断:要强一致、多表关联、事务复杂(钱、账、订单),选关系型;要海量高并发、结构灵活、快速扩展(缓存、日志、推荐),选非关系型。 多数真实系统是两者一起用。
上面的实验,自建和云数据库都能跑。两者的区别在于运维谁扛:
对比项 | 云数据库 MySQL | 自建 MySQL |
|---|---|---|
部署 | 控制台几分钟开通 | 手动安装配置 |
高可用 | 主备自动切换 | 自己搭主从 / MHA |
备份 | 自动物理备份、任意时间点恢复 | 自己写脚本 |
扩容 | 控制台升配 / 加只读实例 | 自己规划 |
成本 | 月费(含运维) | 硬件 + 人力 |
落地实操注意三点:
utf8mb4,否则中文乱码、emoji 存不进去。再往云原生看,数据库正在发生一次形态演进:存算分离(计算和存储独立伸缩)、Serverless(按用量计费、自动启停)、HTAP(事务和分析一套库搞定)。选云数据库时,如果你的业务量波动大,Serverless 形态能省不少成本;如果既要交易又要实时分析,可以关注 HTAP 能力。

把上面散落的坑汇总成一张清单,落地时逐条过:
动手验证完,关系型数据库你已经亲眼见到了三个核心:
下一步建议:把上面的 SQL 在自己的 MySQL 里完整跑一遍,再试着给 orders 插一条不存在用户的外键、故意跑一个会失败的事务,感受约束和事务的力量。跑通了,「什么是关系型数据库」这个问题就算真正过手了。
在信创、国产化替代的大背景下,「降低 MySQL 依赖」已经排进很多企业的年度计划。国产关系型数据库大多兼容 MySQL 或 Oracle 的语法,迁移时能省不少改造的力气。KingbaseES Oracle兼容版也在今年3月发布了全面升级新版本,以后可以专门写一篇,这里你只需要知道:关系型数据库不只有 MySQL 和 Oracle,国产库已经是绕不开的选项。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。