什么是实体关系图(ERD)?
一个实体关系图(ERD)是一种用于设计、文档化和分析关系型数据库的结构蓝图。它可视化系统中的表(实体)、它们包含的特定列(属性),以及这些表之间的关联方式。在 PlantUML 中,ERD 使用信息工程(IE)表示法,采用标准乌鸦足表示法来表示关系约束。
无论你是设计微服务数据存储、优化 SQL 连接路径,还是规划企业级数据仓库架构,基于文本的 UML ERD 都能确保你的数据库模式清晰明了。借助VPasCode,你可以使用简洁、声明式的语法来定义数据库表、索引键和逻辑关系。引擎会自动处理表格框的大小调整,并自动路由外键连接线,而不会出现重叠的布局线条。
核心语法指南:元素与结构
在 PlantUML 中构建稳健的 IE 风格 ERD,依赖于结构化的实体块、明确的键标识以及乌鸦足基数修饰符。
1. 声明实体(数据库表)
你使用entity关键字,后跟表名和一对花括号。在花括号内,列出你的表列。为了使你的模式清晰易读,使用水平分隔线(--)将主键/外键与标准数据属性分隔开:
entity "users" as users_table {
id : INT [PK]
--
email : VARCHAR(255)
created_at : TIMESTAMP
} 
2. 标识主键和外键
虽然像 `[PK]` 或 `[FK]` 这样的文本标识符效果良好,但 PlantUML 的 IE 引擎还支持视觉化的键图标。在属性前放置一个星号(*)表示该列是**强制性(非空)**的,而干净的文本字符串或标签则添加了明确的索引上下文:
实体 "orders" {
* id : INT <<PK>>
--
* user_id : INT <<FK>>
discount_code : VARCHAR(50)
} 
3. 映射乌鸦足基数和关系
要连接表并强制执行引用完整性约束,请使用连字符、方括号和管道字符的组合。在 IE 表示法中,这些符号形成不同的 **乌鸦足** 头部,表示数据库关系:
||--||**一对一:** 严格且强制的一对一映射。||--o|**一对一(可选):** 可选的一对一映射。||--|{**一对多(强制):** 强制的一对多依赖关系。||--o{**一对多(可选):** 标准的可选一对多关系。

干净数据库模式的最佳实践
- 保持大小写约定: 保持实体声明的可预测性。对于实际映射到 SQL 的表,使用小写蛇形命名法(例如,
order_items),或对概念域模型使用大写驼峰命名法。 - 始终记录外键: 在连接两个表时,始终在子表块内指定外键列。这为工程团队在数据迁移期间提供了清晰的参考上下文。
- 控制乌鸦足间距: 包含数十个表的复杂数据库模式可能会迅速变得拥挤。如果关系线开始不自然地交叉,请将双连字符连接器(
--) 替换为三连或四连字符(---),以拉开表之间的距离,使布局引擎有更多空间来组织网格。
现实世界中的 PlantUML ERD 示例
示例 1:核心电商关系模型(键与映射)
此功能蓝图模拟了核心电商数据库的交易循环,展示了用户、订单和支付账本如何通过严格的crow’s foot关系相互关联。
@startuml
' 将实体框渲染固定为锐利的现代方形
hide circle
skinparam LINETYPE ortho
entity "users" as user {
* id : INT <<PK>>
--
* email : VARCHAR(100)
* password_hash : VARCHAR(255)
phone : VARCHAR(20)
}
entity "orders" as order {
* id : INT <<PK>>
--
* user_id : INT <<FK>>
* total_amount : DECIMAL(10,2)
status : VARCHAR(50)
}
entity "payment_ledgers" as ledger {
* id : INT <<PK>>
--
* order_id : INT <<FK>>
* transaction_reference : VARCHAR(100)
gateway : VARCHAR(50)
}
' 定义关系模式绑定
user ||--o{ order : "下单"
order ||--|| ledger : "生成"
@enduml 
语法解析: 指令 hide circle 禁用了默认的 UML 类标记气泡,而 skinparam LINETYPE ortho 强制关系路径呈现为清晰的 90 度直角。该模式明确显示,一个用户可以下零个或多个订单(||--o{),而一个订单必须恰好关联一个支付账本记录(||--||).
示例 2:高级内容管理系统模式(多对多交集)
此高级企业蓝图描绘了完整的内容管理系统(CMS)拓扑结构。它展示了如何通过使用中间映射表,清晰地处理多对多架构。
@startuml
hide circle
skinparam LINETYPE ortho
entity "posts" as post {
* id : INT <<PK>>
--
* author_id : INT <<FK>>
* title : VARCHAR(255)
slug : VARCHAR(255)
body : TEXT
}
entity "categories" as category {
* id : INT <<PK>>
--
* name : VARCHAR(100)
description : VARCHAR(255)
}
entity "post_category_mappings" as mapping {
* post_id : INT <<PK>><<FK>>
* category_id : INT <<PK>><<FK>>
--
assigned_at : TIMESTAMP
}
entity "comments" as comment {
* id : INT <<PK>>
--
* post_id : INT <<FK>>
author_name : VARCHAR(100)
* content : TEXT
}
' 关系链接结构
post ||--o{ mapping : "包含"
category ||--o{ mapping : "分类"
post ||--o{ comment : "附加"
@enduml 
语法解析: 此模板模拟了文章与分类之间的经典多对多关系。它并未直接连接两者,而是引入了一个中间表(post_category_mappings),其中两个列共同作为复合主键。crow’s foot 指示器明确地将级联关系映射到评论层。