3分钟画出能给业务讲明白的ER图:Mermaid erDiagram实战指南
【免费下载链接】mermaidGeneration of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown项目地址: https://gitcode.com/GitHub_Trending/me/mermaid
Mermaid 的 erDiagram 语法用几行纯文本就能画出实体关系图(ER 图),不用打开重型画图工具。本文从一条关系线讲起,覆盖属性、基数标记、子图分组这几个常用技巧,让你在文档里直接描述数据模型。
3分钟画出第一条关系线
场景:新来的同事问数据库怎么设计的。打开 UML 工具要十分钟,在 Markdown 文档里敲三行只要十秒。
渲染后会得到 CUSTOMER 和 ORDER 两个实体框,中间由一条带鸦脚符号的连线连起来,线上标着 "places"。
每条关系语句由四部分组成:前实体、关系标记、后实体、冒号后的标签。注意标签是从前实体视角读的——"客户下单",而不是"订单下客户"。
上面效果是一个经典订单模型:除了关系线,每个实体还标注了属性,CUSTOMER、ORDER、INVOICE 之间的关联全部落在同一张图里。
给实体框标上属性和主键
关系线只说明"怎么连",属性才说明"框里装了什么"。在实体名后跟一段{}代码块,每行写类型 名称:
解析后 CUSTOMER 框下方自动展开属性区,每行显示"类型 + 名称",custNumber 旁带一个主键符号。
键约束有三种:PK主键、FK外键、UK唯一键,用逗号分隔可叠加(如PK, FK)。行尾双引号是注释,类型后加?表示可空字段:
类型没有内置清单,以字母开头即可,所以decimal(10,2)这类自定义写法也完全合法。
用基数标记说清"多少条"
关系标记实际分三段:左端基数 + 连接类型 + 右端基数。每端两个字符,外字符是最大值、内字符是最小值,四种组合覆盖绝大多数业务场景:
| 标记 | 含义 | 场景示例 |
|---|---|---|
\|o/o\| | 零或一 | 订单对应零或一张发票 |
\|\| | 恰好一 | 订单行必属于唯一订单 |
}o/o{ | 零或多 | 客户可有零个收货地址 |
}\|/\|{ | 一或多 | 订单至少含一行明细 |
上图是典型的鸦脚效果:Galaxy 到 Star、Quasar、Nebula 的连线末端带鸦脚,表示"零或多个"。
连接类型还分两态:实线--是识别关系,子实体离开父实体无法独立存在;虚线..是非识别关系:
渲染后 CAR 那条是实线(车辆登记记录离开车就没意义),PERSON 那条是虚线(人有没有驾驶记录都独立存在)。这正是官方文档里的"驾照记录"建模例子。
用子图把大图分模块
实体一多,全铺在一层就像一盘意大利面。v11.17.0 起 erDiagram 支持子图,把实体按业务域圈起来,还可以嵌套:
渲染后每个子图被带标题的边框圈住,两个模块不再互相穿插。整图太高时,可以在开头加direction LR改成横向布局,子图内部还能单独声明方向。
一个小细节:关系里引用子图用的是 id 而不是标题;id 含空格时必须加双引号,否则解析报错。
出错了怎么办
⚠️ 几个高频踩坑点:
- 实体名带空格或特殊字符要整体加双引号,如
"客户账户";中文实体名则可以直接写。 - 两个实体之间可以同时有多条关系线(比如一条记账单、一条记发货),各写一行即可,互不覆盖。
- 大图标得拥挤:在 frontmatter 里加
layout: elk切换 ELK 布局,交叉会明显减少,需要 v9.4 以上版本。 - 拿不准语法时最稳的办法是打开 Mermaid 在线编辑器,左边写右边看,所见即所得。
💡 从一条关系线到子图分组,erDiagram 让数据模型变成可评审、可 diff、能直接提交进仓库的 Markdown 文本块。更多语法细节见 docs/syntax/entityRelationshipDiagram.md,解析与渲染实现在 packages/mermaid/src/diagrams/er/,想深挖行为可以直接对照源码。
【免费下载链接】mermaidGeneration of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown项目地址: https://gitcode.com/GitHub_Trending/me/mermaid
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考