从 0 到 1 设计数据库:需求→E-R 图→三范式→建表,一篇就够!(五)
作者:鄢晓波
日期:2025-08-03
关键词:数据库设计、需求分析、E-R 图、三范式、表设计、中间表
全文可复制的 MySQL 代码 + 手绘示意图,跟着做就能跑通一个小型“书评网站”数据库。
一、为什么一定要先画蓝图?
没做需求分析就建库 ≈ 没图纸就盖楼:
- 盖完发现缺楼梯(缺功能)
- 多盖了 3 层(功能过度)
- 楼歪了(数据不一致)
正确姿势:
需求定义 → 设计 → 开发 → 引入 → 运营
二、需求定义:把“一句话需求”拆成可落地的功能
以“书评网站”为例:
| 需求 | 用户故事 | 页面 |
|---|---|---|
| 用户注册 | 我想注册账号 | 注册页 |
| 浏览图书 | 我想看最新图书 | 图书列表 |
| 写评论 | 我想给书打分 | 图书详情+评论页 |
| 收藏图书 | 我想收藏书单 | 收藏夹 |
把讨论结果写成《需求定义文档》,所有人签字画押。
三、提取实体 & 属性:把“东西”变“表”
先把页面里出现的名词圈出来 → 实体 → 再补属性:
实体 属性示例
用户 用户名、密码、个人简介
图书 书名、作者、登记日期
评论 标题、内容、发表时间
收藏 用户ID、图书ID
四、E-R 图:一眼看懂“谁和谁勾搭”
用 3 个符号就能画:
- 矩形:实体
- 椭圆:属性
- 菱形:关系(箭头指向“多”)
手绘示意图:
用户 1 ──────→ 多 评论
图书 1 ──────→ 多 评论
用户 多 ←───→ 多 图书 (收藏夹)
五、三范式:拒绝数据“自我复制”
把 Excel 大宽表拆成“乐高”小表。
5.1 第一范式 1NF:列里不能再套娃
非范式(×) 1NF(√)
一行存 3 个学生 一行只存 1 个学生
5.2 第二范式 2NF:把“依赖”拆开
把“课程名称→教师姓名”拆出去,单独建课程表。
5.3 第三范式 3NF:继续拆从属
“教师姓名→教师联系方式”再拆一层,独立教师表
最终得到 3 张小表:
- 课程表(course)
- 教师表(teacher)
- 学生表(student)
六、建表实战:书评网站 4 张表
6.1 用户表 users
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
biography TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
6.2 图书表 books
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
author_name VARCHAR(100) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
6.3 评论表 reviews
CREATE TABLE reviews (
id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT NOT NULL,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
comment TEXT NOT NULL,
FOREIGN KEY (book_id) REFERENCES books(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
6.4 收藏夹中间表 favorites(多对多)
CREATE TABLE favorites (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
book_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (book_id) REFERENCES books(id),
UNIQUE (user_id, book_id) -- 防止重复收藏
);
七、命名规范:让同事一眼看懂
规则 好例子 坏例子
小写+下划线 user_id UserID
表名单数 book books
布尔 is_xx is_deleted delete_flag
外键统一 表名单数_id uid, bid 混用
八、一张脑图总结
需求 → 实体&属性 → E-R图 → 三范式 → 建表+约束
九、彩蛋:一键初始化脚本
复制即可跑通:
-- 一键建库
CREATE DATABASE book_review DEFAULT CHARSET utf8mb4;
USE book_review;
-- 上面 4 个建表语句跑一遍
-- 插几条演示数据
INSERT INTO users(name, password) VALUES ('alice','123'),('bob','456');
INSERT INTO books(title, author_name) VALUES ('MySQL 图解','Kimi');
INSERT INTO reviews(book_id, user_id, title, comment)
VALUES (1,1,'好书','通俗易懂');
INSERT INTO favorites(user_id, book_id) VALUES (1,1),(2,1);
至此,一个符合三范式、带外键、可扩展的书评数据库就设计完成啦!
如果觉得有用,记得点赞 + 收藏 + 转发!

7454



被折叠的 条评论
为什么被折叠?



