ER 图(Entity-Relationship Diagram)

1. 定义

ER 图 是一种概念建模图,用来在动手写 SQL 之前,先把”现实世界里有哪些东西、它们之间什么关系”画清楚。它是数据库设计的蓝图阶段,独立于具体数据库(MySQL / PostgreSQL / SQLite 都通用)。

类比:ER 图像小说的角色关系图——先理清”谁是主角、谁和谁是情侣、谁是反派的手下”,再动笔写正文(建表)。直接跳到写表,容易把关系写乱。

关联:ER 图是”设计”,落下来就是 schema.md 里讲的数据库 schemaCREATE TABLE 那套结构);ER 图到 schema 的转化规则见第 4 节。

2. 核心元素(Chen 表示法)

元素图形含义例子
实体 (Entity)矩形现实里可区分的”事物/对象”UserOrderProduct
属性 (Attribute)椭圆实体的特征;主键 PK 加下划线Useridnameemail
关系 (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
  • MCPpostgres 等 MCP Server 会把库结构(即上面落地的 schema)当 Resource 返回给模型;见 ../ai-agent-guide/mcp.md