PlantUML ERD 语法指南

什么是实体关系图(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 指示器明确地将级联关系映射到评论层。

滚动至顶部