ERD(实体关系图)

关于 ERD

**实体关系图(ERD)**记录关系型数据库的结构:数据表(实体)、其字段(属性),以及数据表之间的外键关系——包括基数(1..1 / 0..1 / 1..N / 0..N)。后端工程师用它向新团队成员介绍代码库。数据架构师在编写任何 DDL 之前先在白板上画出草图。数据库教育者(Elmasri & Navathe;Silberschatz / Korth / Sudarshan)将其置于每门计算机科学数据库课程的概念设计单元核心。

Schematex 实现乌鸦脚记号法——MySQL Workbench、dbdiagram.io、ERDPlus、Lucidchart、draw.io、Mermaid erDiagram 和 Oracle SQL Developer Data Modeler 都采用的现代实际标准。DSL 与 DBML 大致兼容,让工程师可以直接粘贴;它也完整接受 Mermaid erDiagram 方言——以 erDiagram 标头开头,直接粘入 Mermaid 关系式(CUSTOMER ||--o{ ORDER : places)和以类型为首的实体块(ORDER { int id PK }),实体会从关系中自动创建。Chen 1976 记号法(矩形 + 菱形 + 椭圆形 + ISA 层次)和 Barker 叠加层延后至 v0.2;目前每张图都渲染为乌鸦脚记号法。

注意 — 这与 entity 引擎不同entity(法律实体结构)用于公司/法律持有层次(子公司、股比汇总、信托)。erd 用于数据库架构(数据表、字段、外键)。不同领域、不同布局、不同受众。

erd·§
↘ preview
100%
University Schema Entity-Relationship Diagram with 4 entities and 3 relationships. University Schema majors in Major major_id int PK name varchar Course course_id int PK title varchar credits int Student student_id int PK name varchar email varchar UK major_id int FK Enrollment student_id int PK FK course_id int PK FK grade char
UTF-8 · LF · 30 lines · 674 chars✓ parsed·0.9 ms·8.1 KB SVG

1. 你的第一张 ERD

最精简的实用 ERD:一张父数据表被子数据表通过外键引用。

erd·§
↘ preview
100%
Schematex ERD Entity-Relationship Diagram with 2 entities and 1 relationships. places Customer customer_id int PK email varchar UK Order order_id int PK customer_id int FK
UTF-8 · LF · 10 lines · 252 chars✓ parsed·0.4 ms·4.3 KB SVG

四条规则涵盖 80% 的用法:

  1. erd 开头。可选的标头:title:direction: LR | TB
  2. 每张数据表是一个块:table 名称 { 字段 类型 标记 }。标记为 PKFKUKNN(或 *,表示 NOT NULL)。
  3. 行内外键目标:在字段后加上 FK -> 其他表.字段。渲染器会自动加上 FK 标签。
  4. ref 行连接数据表:ref 来源 <左基数> -- <右基数> 目标 [: "标签"]。基数可用具名形式(one-mandatoryone-optionalmany-mandatorymany-optional)、Min-Max 形式(1..1 / 0..1 / 1..N / 0..N),或 Mermaid 符号(}o--|| 等)作为别名。

注释使用 //#。块形式可以是多行(每字段一行)或行内(table A { id int PK; name varchar })。


2. 基数符号

乌鸦脚记号法在关系线的每一端编码基数:

符号读法Min..Max具名标记
─┃(垂直线)恰好一个(强制一)1..1one-mandatory
─○(空心圆)零或一个(可选一)0..1one-optional
─┃<(线 + 乌鸦脚)一个或多个(强制多)1..Nmany-mandatory
─○<(圆 + 乌鸦脚)零个或多个(可选多)0..Nmany-optional

线条的每一端可独立标注。典型的 1:N 关系读作"恰好一个 CUSTOMER 下零个或多个 ORDER":

ref Order.customer_id many-mandatory -- one-mandatory Customer.customer_id : "places"

从右到左读:线条的右端以单线连接 Customer(one-mandatory);左端以线+乌鸦脚连接 Order(many-mandatory)。


3. Mermaid 别名

若你已使用 Mermaid erDiagram,相同的符号可直接作为输入:

erd·§
↘ preview
100%
Schematex ERD Entity-Relationship Diagram with 3 entities and 2 relationships. places contains Customer customer_id int PK email varchar UK Order order_id int PK customer_id int FK Product product_id int PK name varchar
UTF-8 · LF · 7 lines · 266 chars✓ parsed·2.3 ms·5.8 KB SVG
Mermaid 标记Schematex 含义
|o 左 / o|0..1
||1..1
}o 左 / o{0..N
}| 左 / |{1..N
--识别性/实线
..非识别性/虚线

4. 识别性与非识别性关系

使用 -- 表示识别性关系(实线),.. 表示非识别性关系(虚线):

erd·§
↘ preview
100%
Schematex ERD Entity-Relationship Diagram with 2 entities and 1 relationships. logs (optional FK) User id int PK email varchar SessionLog id int PK user_id int FK created_at timestamp
UTF-8 · LF · 5 lines · 214 chars✓ parsed·0.4 ms·4.4 KB SVG

虚线遵循 Barker / IDEF1X 非识别性惯例。


5. 复合主键(关联数据表)

关联(连接)数据表用于解析 M:N 关系。同时带有 PKFK 标记的字段:

erd·§
↘ preview
100%
Schematex ERD Entity-Relationship Diagram with 3 entities and 2 relationships. Student student_id int PK name varchar Course course_id int PK title varchar Enrollment student_id int PK FK course_id int PK FK grade char
UTF-8 · LF · 10 lines · 381 chars✓ parsed·0.5 ms·5.7 KB SVG

Schematex 在同一行渲染两个标签(PK + FK)。当任何 PK 标记存在时,字段名称会加上下划线。


6. 布局方向

direction: LR(默认)将父数据表置于左侧,子数据表置于右侧。direction: TB 切换为由上到下——适合窄幅嵌入:

erd·§
↘ preview
100%
Library (top-down) Entity-Relationship Diagram with 3 entities and 2 relationships. Library (top-down) borrowed by of Member id int PK name varchar email varchar UK Book id int PK title varchar author varchar Loan id int PK member_id int FK book_id int FK due_date date
UTF-8 · LF · 10 lines · 409 chars✓ parsed·0.6 ms·6.7 KB SVG

采用单折边的分层正交曼哈顿路由。v0.1 在层内使用声明顺序堆叠;重心交叉最小化延后至 v0.2。


7. 记号模式

DSL 标头可以固定记号法:

erd
notation: crowsfoot     // default — only mode supported in v0.1

notation: chen(矩形-菱形-椭圆形、弱实体、三元关系、ISA)和 notation: barker(每半侧虚线)已在 27-ERD-STANDARD.md 中记录,但目前解析器拒绝接受。目标版本 v0.2。


8. v0.1 的限制

  • 仅支持乌鸦脚记号法。 Chen 和 Barker 渲染延后实现。
  • 无边线交叉最小化。 分层布局在层内使用声明顺序;大型 ERD(10 张以上数据表、密集外键)会出现一些交叉。若特定布局很重要,请重新排列 table 块的顺序。
  • 无自我引用的 C 形曲线。 递归关系(Employee.manager_id -> Employee.id)可解析但路由为直正交线,而非标准的 C 形。
  • 无 M:N 自动解析。 请明确表示关联实体(这也是生产架构中的标准实践)。

完整标准参考请见 docs/reference/27-ERD-STANDARD.md


相关示例

示例库中的即用场景:

erd·§ Crow's-foot (Everest 1976) / DBML compatible
University Schema Entity-Relationship Diagram with 4 entities and 3 relationships. University Schema majors in Major major_id int PK name varchar Course course_id int PK title varchar credits int Student student_id int PK name varchar email varchar UK major_id int FK Enrollment student_id int PK FK course_id int PK FK grade char
University schema (academic ERD)
Classic textbook schema with Student / Course / Enrollment associative entity and labelled relationships — the canonical Elmasri & Navathe ch.3 example.
education
erd·§ Crow's-foot (Everest 1976) / DBML compatible
E-commerce Schema Entity-Relationship Diagram with 6 entities and 5 relationships. E-commerce Schema places Customer customer_id int PK email varchar UK name varchar created_at timestamp Category category_id int PK name varchar Address address_id int PK customer_id int FK line1 varchar city varchar zip varchar Order order_id int PK customer_id int FK placed_at timestamp status varchar Product product_id int PK category_id int FK name varchar price decimal OrderLine order_id int PK FK line_no int PK product_id int FK qty int price decimal
E-commerce schema
Production-style schema with Customer / Order / OrderLine / Product / Category — typical mid-complexity backend ERD with composite PK on the line-item table.
software & it

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.