PlantUML ER 图:实体、键和关系
PlantUML ER 图可以用文本记录数据库实体和基数。对于面向实际数据库模式的视图,PlantUML 的信息工程(IE)表示法通常最直接:定义实体、列出属性,再用乌鸦脚关系连接它们。PlantUML 还支持 Chen 表示法,而类图语法则为面向领域的模型提供了第三种选择。
本教程将构建一个包含客户、订单、商品和订单行的订单数据库。如果需要先比较图表类型,请浏览 PlantUML 示例指南。
要点总结
- PlantUML 同时支持信息工程和 Chen ER 表示法;两者是不同的建模风格。
- IE 语法在类图语法基础上增加了实体声明、必填属性标记和乌鸦脚端点。
- PlantUML 的
*属性标记表示必填,而不是主键。- 主键和外键标签由你自行约定;渲染器不会验证 DDL 或引用完整性。
- 使用 ERD 描述存储结构,使用类图表达面向对象的设计决策。
前置条件与表示法选择
你需要一个支持 IE 图的 PlantUML 渲染器。下面的语法遵循官方信息工程图文档(检索于 2026 年 7 月 24 日)。
PlantUML 提供两种 ER 相关方法:
- IE 表示法使用实体框和乌鸦脚基数,适合讨论面向实现的数据库模式。
- Chen 表示法将实体、关系和属性表示为独立形状,适合概念数据建模。
官方 Chen EER 文档使用不同语法。不要把一种表示法的关系线复制到另一种表示法中,并假定含义相同。
第 1 步:定义实体
使用 entity,后接名称和主体。在 IE 语法中,entity 是 class 的别名,因此类图的大部分格式模型仍然适用。
@startuml
entity Customer {
* customer_id : UUID <<PK>>
--
* email : VARCHAR(255)
display_name : VARCHAR(120)
* created_at : TIMESTAMP
}
@enduml
在 IE 表示法中,开头的 * 将属性标记为必填。<<PK>> 是作者选择的标签,用于传达主键意图;PlantUML 不会推断或强制执行它。-- 分隔符会在实体主体中创建视觉分隔。
第 2 步:添加主键和外键约定
整个项目应使用一种有文档说明的约定。<<PK>>、<<FK>> 和 <<UK>> 等类构造型标签易于理解,但仍只是图表注解。
@startuml
entity Customer {
* customer_id : UUID <<PK>>
--
* email : VARCHAR(255) <<UK>>
}
entity Order {
* order_id : UUID <<PK>>
--
* customer_id : UUID <<FK>>
* status : VARCHAR(30)
* placed_at : TIMESTAMP
}
@enduml
即使 customer_id 类型错误或没有指向任何对象,图表依然可以渲染。请单独评审实际迁移或 DDL。ERD 是文档,不是数据库模式验证器。
第 3 步:阅读乌鸦脚基数
IE 关系将两侧端点组合起来。官方表示法包括:
| 端点 | 含义 |
|---|---|
| ` | o` |
| ` | |
}o | 零个或多个 |
| `} | ` |
你可以反转端点,从任一方向表达关系。请始终添加动词标签,让读者除了数量之外还能理解业务含义。
@startuml
entity Customer
entity Order
Customer ||--o{ Order : places
@enduml
这表示每个订单恰好属于一个客户,而一个客户可以下零个或多个订单。基数不会自动描述删除行为、级联、唯一性,也不会说明关联在事务期间是否可以暂时无效。
第 4 步:建立多对多关系模型
关系数据库模式通常用关联实体拆解多对多关系。在订单系统中,OrderLine 连接订单和商品,同时携带数量与购买时价格。
@startuml
entity Order {
* order_id : UUID <<PK>>
}
entity Product {
* product_id : UUID <<PK>>
--
* sku : VARCHAR(40) <<UK>>
* current_price : DECIMAL
}
entity OrderLine {
* order_id : UUID <<PK, FK>>
* line_number : INTEGER <<PK>>
--
* product_id : UUID <<FK>>
* quantity : INTEGER
* unit_price : DECIMAL
}
Order ||--|{ OrderLine : contains
Product ||--o{ OrderLine : referenced by
@enduml
复合键注解是一种建模约定。它记录设计意图,但不会创建数据库约束。
第 5 步:构建完整 ERD
下面的源代码可直接复制,涵盖实体、必填与可选属性、键及四种关系形式。
@startuml
title Order database ERD
left to right direction
entity Customer {
* customer_id : UUID <<PK>>
--
* email : VARCHAR(255) <<UK>>
display_name : VARCHAR(120)
* created_at : TIMESTAMP
}
entity Address {
* address_id : UUID <<PK>>
--
* customer_id : UUID <<FK>>
* line_1 : VARCHAR(255)
line_2 : VARCHAR(255)
* city : VARCHAR(120)
* country_code : CHAR(2)
}
entity Order {
* order_id : UUID <<PK>>
--
* customer_id : UUID <<FK>>
shipping_address_id : UUID <<FK>>
* status : VARCHAR(30)
placed_at : TIMESTAMP
}
entity OrderLine {
* order_id : UUID <<PK, FK>>
* line_number : INTEGER <<PK>>
--
* product_id : UUID <<FK>>
* quantity : INTEGER
* unit_price : DECIMAL(12,2)
}
entity Product {
* product_id : UUID <<PK>>
--
* sku : VARCHAR(40) <<UK>>
* name : VARCHAR(255)
* current_price : DECIMAL(12,2)
}
Customer ||--o{ Address : stores
Customer ||--o{ Order : places
Address |o--o{ Order : selected for
Order ||--|{ OrderLine : contains
Product ||--o{ OrderLine : referenced by
@enduml
订单一侧的地址关系是可选的,因为本示例允许订单在选定配送详情前存在。这是一项业务决策,并非 PlantUML 的建议。
IE、Chen 与类图对比
根据问题选择表示法:
| 问题 | 最佳起点 |
|---|---|
| 我们将存储哪些表、属性和基数? | IE ER 图 |
| 存在哪些概念实体和关系? | Chen ER 图 |
| 存在哪些类型、方法、继承和对象生命周期? | 类图 |
PlantUML 类图指南介绍组合、聚合、依赖和可见性。类图可能与 ERD 外观相似,但不应将这两个视图视为可以互换。
创建这些记录的运行时请求应放入 PlantUML 时序图指南。如需展示数据库周围更高层的应用边界,请继续查看 C4-PlantUML 上下文和容器视图。
ER 图常见错误
| 错误 | 影响 | 修正方式 |
|---|---|---|
将 * 当作主键符号 | IE 将其定义为必填标记 | 添加明确且有文档说明的键标签 |
| 省略关系动词 | 只有数量无法解释含义 | 添加 places 或 contains 等标签 |
| 直接绘制多对多表 | 关系属性无处存放 | 添加关联实体 |
| 假定渲染的类型有效 | PlantUML 不解析数据库 DDL | 针对目标 DBMS 验证迁移 |
| 混用 IE 和 Chen 语法 | 两种表示法使用不同构造 | 每个视图只选择一种表示法 |
| 将 ERD 作为唯一文档 | 行为与所有权仍不清晰 | 链接到时序图、类图或架构视图 |
常见问题解答
PlantUML 有专门的 ERD 语法吗?
有。PlantUML 提供信息工程表示法和 Chen EER 表示法文档。IE 在类图语法基础上增加乌鸦脚端点和必填属性;Chen 则使用独立的概念表示法。
如何标记主键?
使用有明确说明的标签,例如 <<PK>>。不要依赖 IE 的 *,因为官方文档将其定义为必填属性标记。
当模型需要表达方法、接口、继承或生命周期所有权,而不是面向数据库的实体时,请使用官方 PlantUML 类图语法及相关类图指南。
PlantUML 可以生成 SQL 吗?
图表语法本身不会验证或生成生产数据库模式。请使用数据库专用的迁移或建模工具生成可执行 DDL,并通过评审或自动化让图表保持同步。
可以在哪里比较 Mermaid 和 PlantUML ER 图?
如需选择工具,请参阅现有的 Mermaid 与 PlantUML ER 图对比。
后续步骤
复制完整 ERD,将实体替换为自己的数据库模式,并说明每个键标签和可选端点的含义。然后将渲染图表与实际迁移文件进行比较。
使用 PlantUML 示例中心选择下一个视图,用类图教程描述领域结构,或用 PlantUML C4 指南描述架构。完整表示法请参阅官方 IE 图和 Chen ER 图页面。