ER 图(Entity-Relationship Diagram)
1. 定义
ER 图 是一种概念建模图,用来在动手写 SQL 之前,先把”现实世界里有哪些东西、它们之间什么关系”画清楚。它是数据库设计的蓝图阶段,独立于具体数据库(MySQL / PostgreSQL / SQLite 都通用)。
类比:ER 图像小说的角色关系图——先理清”谁是主角、谁和谁是情侣、谁是反派的手下”,再动笔写正文(建表)。直接跳到写表,容易把关系写乱。
关联:ER 图是”设计”,落下来就是
schema.md里讲的数据库 schema(CREATE TABLE那套结构);ER 图到 schema 的转化规则见第 4 节。
2. 核心元素(Chen 表示法)
| 元素 | 图形 | 含义 | 例子 |
|---|---|---|---|
| 实体 (Entity) | 矩形 | 现实里可区分的”事物/对象” | User、Order、Product |
| 属性 (Attribute) | 椭圆 | 实体的特征;主键 PK 加下划线 | User 的 id、name、email |
| 关系 (Relationship) | 菱形 | 实体之间如何关联 | User 下 Order(“下单”) |
| 弱实体 (Weak Entity) | 双矩形 | 不能独立存在、靠 owner 才能标识 | OrderItem 依赖 Order |
映射基数(Cardinality)—— 关系的”数量规则”
表示”一个 A 对应几个 B”:
- 1:1 —— 一个用户对应一个身份证
- 1:N —— 一个用户下 多 个订单
- N:N —— 一个学生选 多 门课,一门课有 多 个学生
工程里更常用 Crow’s Foot(鱼尾纹) 表示法:用”乌鸦脚”画在连线末端表示”多”,比 Chen 的椭圆/菱形更适合画在数据库设计工具(如 drawSQL、dbdiagram.io)里。两者表达同一件事,只是画法不同。
3. 参与约束(常被忽略)
- 全部参与 (total participation):每个实体都必须卷入该关系(双线连接)。例如”每个订单必须属于某个用户”——
Order全参与placed_by。 - 部分参与 (partial participation):可有可无(单线)。例如”用户可能有零个或多个订单”。
这条约束直接决定了建表时外键列能不能为 NULL。
4. ER 图 → 关系 Schema 的转化规则 ⭐
ER 图不是摆设,它有一套机械的落地规则,设计完就能直接翻译成 schema.md 里的 CREATE TABLE:
| ER 元素 | 落地成 schema |
|---|---|
| 实体 (Entity) | 一张表 |
| 属性 (Attribute) | 表的列 |
| 主键属性 | 列的 PRIMARY KEY |
| 1:N 关系 | 在”多”的那侧表加外键 (FK) 指向”一”侧 |
| 1:1 关系 | 任一侧加 FK,或合并成一张表 |
| N:N 关系 | 新建一张关联表,两端各一个 FK(⚠️ 不能直接加外键,见误区) |
| 弱实体 | 关联表 + 部分主键来自 owner 的 PK |
示例(1:N:User 下一堆 Order):
CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE order (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL, -- 外键,来自 1:N 关系
amount REAL,
FOREIGN KEY (user_id) REFERENCES user(id)
);5. 常见误区
-
❌ “ER 图就是 schema。” ✅ ER 图是概念/逻辑模型,与具体数据库无关;schema 是物理实现(具体到
INT/TEXT、索引、约束)。ER 图回答”有什么、什么关系”,schema 回答”怎么存”。两者差一个”落地”步骤(第 4 节)。 -
❌ “N:N 关系直接在两边加外键就行。” ✅ 一张表只能挂一个外键指向另一张,放不下”多对多”。正确做法是新建关联表(如
student_course(student_id, course_id)),两边各一个 FK。 -
❌ “关系画得越细越好。” ✅ 过度建模(给每对实体都加关系)会让图臃肿、落地后的表难以维护。先抓核心实体与关系,能靠外键/FK 表达的不必都单独成关系。
-
❌ “主键随便选个字段当就行。” ✅ 主键应稳定、唯一、无业务含义(推荐自增
id或 UUID)。用email当 PK,万一用户改邮箱,所有外键引用都要跟着改。
6. 延伸阅读 / 关联概念
- schema — ER 图的落地结果(
CREATE TABLE/ 表结构);见schema.md - SQLite / Turso — 用 SQL 把 ER 图实现成真实库;见
sqlite-turso.md - MCP —
postgres等 MCP Server 会把库结构(即上面落地的 schema)当 Resource 返回给模型;见../ai-agent-guide/mcp.md