Mermaid.js ERD 语法指南

什么是实体关系图(ERD)?

一个实体关系图(ERD)是一种用于设计、文档化和分析关系数据库模式的结构蓝图。它概述了应用程序中的特定数据表(实体)、嵌套在这些表中的列(属性),以及将它们联系在一起的引用完整性规则。使用标准信息工程(IE)符号,它使用清晰的乌鸦足符号符号头来表示数据约束和多表依赖关系。

使用Mermaid.js,你可以使用简洁的声明式文本块来定义生产环境中的表索引、数据类型和外键连接。引擎会自动处理多列布局容器的尺寸,并路由连接线,而不会让文本标签重叠。

核心语法指南:元素与结构

在 Mermaid 中构建一个有效且可完全运行的数据库模式,依赖于结构化的实体块、数据类型映射、索引标签和基数运算符。

1. 声明实体和表列

你可以在第一行使用erDiagram关键字来初始化 ERD 画布。要定义一个表,请写出实体名称,后跟一个左大括号,将列配置按顺序逐行列出:

2. 标记主键、外键和注释

Mermaid 的 ERD 引擎允许你在列名和数据类型定义之后直接分配结构化索引标签。你还可以通过将文本用双引号包裹,为列添加可选的注释:

  • PK — 明确标记一列为表的主键。
  • FK — 标记一列为与父表关联的外键。
erDiagram
    ORDERS {
        int id PK
        int user_id FK "链接到USERS.id"
        string coupon_code
    }

3. 掌握乌鸦足基数修饰符

为了连接表并强制实施引用完整性规则,请使用专用的线操作符来映射它们之间的关系。字符头形成视觉上的乌鸦足形状,用以定义数据多重性约束:

  • ||--|| **一对一:** 严格的、强制性的1:1映射。
  • ||--o| **一对一(可选):** 可选的一对一依赖关系。
  • ||--|{ **一对多(强制):** 强制的一对多父级关联。
  • ||--o{ **一对多(可选):** 标准的、可选的一对多关系。

关系型数据模式的最佳实践

  • 保持表名大小写一致: 保持实体名称可预测。使用大写字符串(例如,USER_ACCOUNTS)或严格的小写蛇形命名法(例如,user_accounts)以匹配您实际的SQL基础设施代码。
  • 始终包含数据类型: 避免在没有类型的情况下声明原始列文本。明确列出如int, varchar,或boolean 确保您的架构图表作为准确的技术参考。
  • 保持关系标签为动词: 在连接元素时,在关系分配中提供一个简短的、小写的主动动词字符串(例如,||--o{ : "包含") 以记录业务逻辑映射。

现实世界的 Mermaid.js ERD 示例

示例 1:核心电子商务事务模型(键与映射)

此功能蓝图模拟了核心电子商务数据库事务循环,展示了用户、订单和支付跟踪系统如何通过严格的乌鸦脚约束相互连接。

erDiagram
    CUSTOMERS {
        int id PK
        string email
        string password_hash
    }

    ORDERS {
        int id PK
        int customer_id FK
        decimal total_amount
        string status
    }

    TRANSACTION_LEDGERS {
        int id PK
        int order_id FK
        string reference_token
        string gateway
    }

    CUSTOMERS ||--o{ ORDERS : "下单"
    ORDERS ||--|| TRANSACTION_LEDGERS : "生成" 

语法分解: 此模式清晰地映射了事务边界。映射规则规定,客户在一段时间内可以下零个或多个订单(||--o{),而单个订单记录必须生成恰好一个匹配的交易账本条目(||--||).

示例 2:企业内容管理系统模式(多对多交集)

此高级数据库蓝图描绘了内容管理平台的架构。它详细说明了如何通过引入显式的桥接映射实体来解决复杂的多对多配置。

erDiagram
    POSTS {
        int id PK
        string title
        string slug
        text body_content
    }

    CATEGORIES {
        int id PK
        string name
        string description
    }

    POST_CATEGORY_MAPPINGS {
        int post_id PK, FK
        int category_id PK, FK
        timestamp assigned_at
    }

    COMMENTS {
        int id PK
        int post_id FK
        string author_name
        text comment_body
    }

    POSTS ||--o{ POST_CATEGORY_MAPPINGS : "包含"
    CATEGORIES ||--o{ POST_CATEGORY_MAPPINGS : "分类"
    POSTS ||--o{ COMMENTS : "附加" 

语法分解: 为处理 `POSTS` 和 `CATEGORIES` 之间的多对多关系,脚本引入了一个交集表(`POST_CATEGORY_MAPPINGS`)。此映射框使用复合键,同时作为主键和外键(PK FK),通过标准的一对多乌鸦脚连接将外部节点连接在一起。

滚动至顶部