PlantUML ER 图:实体、键和关系

··7 min read
plantumler 图erd数据库设计

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 语法中,entityclass 的别名,因此类图的大部分格式模型仍然适用。

@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 将其定义为必填标记添加明确且有文档说明的键标签
省略关系动词只有数量无法解释含义添加 placescontains 等标签
直接绘制多对多表关系属性无处存放添加关联实体
假定渲染的类型有效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 图页面。