Mermaid学习教程,Mermaid画流程图,Mermaid语法讲解,Mermaid使用方法介绍,Mermaid中文参考文档,Mermaid绘图步骤

实体关系图

实体-关系模型(或 ER 模型)描述了特定知识领域中相互关联的感兴趣的事物。基本 ER 模型由实体类型(对感兴趣的事物进行分类)组成,并指定实体之间可能存在的关系(这些实体类型的实例)。维基百科。

请注意,ER 建模的从业者几乎总是将实体类型简称为实体例如,CUSTOMER实体类型将被简称为CUSTOMER实体。这很常见,不建议做任何其他事情,但从技术上讲,实体是实体类型的抽象实例,这就是 ER 图所显示的 - 抽象实例以及它们之间的关系。这就是为什么实体总是使用单数名词命名的原因。

Code Chart 可以渲染 ER 图

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ LINE-ITEM : contains
    CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
CUSTOMERORDERLINE-ITEMDELIVERY-ADDRESSplacescontainsuses

实体名称通常大写,尽管对此没有公认的标准,并且在代码图中也不需要。

实体之间的关系由带有表示基数的结束标记的线表示。Code Chart 使用最流行的鱼尾纹符号。鱼尾纹直观地传达了它所连接的实体的许多实例的可能性。

ER 图可用于各种目的,从没有任何实现细节的抽象逻辑模型到关系数据库表的物理模型。在 ER 图上包含属性定义有助于理解实体的目的和含义。这些不一定是详尽的;通常一小部分属性就足够了。Code Chart 允许根据它们的类型名称来定义它们

erDiagram
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER {
        string name
        string custNumber
        string sector
    }
    ORDER ||--|{ LINE-ITEM : contains
    ORDER {
        int orderNumber
        string deliveryAddress
    }
    LINE-ITEM {
        string productCode
        int quantity
        float pricePerUnit
    }
CUSTOMERstringnamestringcustNumberstringsectorORDERintorderNumberstringdeliveryAddressLINE-ITEMstringproductCodeintquantityfloatpricePerUnitplacescontains

在 ER 图上包含属性时,您必须决定是否包含外键作为属性。这可能取决于您尝试表示关系表结构的紧密程度。如果你的图表是合乎逻辑的如果模型并不意味着关系实现,那么最好将这些排除在外,因为关联关系已经传达了实体关联的方式。例如,JSON 数据结构可以使用数组实现一对多关系,而无需外键属性。类似地,面向对象的编程语言可以使用指向集合的指针或引用。即使对于旨在用于关系实现的模型,您也可能会决定包含外键属性会​​重复关系已经描述的信息,并且不会为实体添加意义。最终,这是您的选择。

句法

实体和关系

ER 图的代码图表语法与 PlantUML 兼容,并带有用于标记关系的扩展。每个语句由以下部分组成:

    <first-entity> [<relationship> <second-entity> : <relationship-label>]

在哪里:

  • first-entity是实体的名称。名称必须以字母字符开头,还可以包含数字、连字符和下划线。
  • relationship描述了两个实体相互关联的方式。见下文。
  • second-entity是另一个实体的名称。
  • relationship-label从第一个实体的角度描述关系。

例如:

    PROPERTY ||--|{ ROOM : contains

该声明可以理解为一个属性包含一个或多个房间,并且一个房间是一个且仅一个属性的一部分您可以看到这里的标签是从第一个实体的角度来看的:一个属性包含一个房间,但一个房间不包含一个属性。当从第二个实体的角度考虑时,等价标签通常很容易推断。(一些 ER 图从两个角度标注关系,但这在这里不受支持,通常是多余的)。

只有first-entity陈述的一部分是强制性的。这使得可以显示没有关系的实体,这在图表的迭代构建过程中很有用。如果指定了语句的任何其他部分,则所有部分都是强制性的。

关系语法

每个语句的relationship部分可以分解为三个子组件:

  • 第一个实体相对于第二个实体的基数,
  • 关系是否赋予“子”实体身份
  • 第二个实体相对于第一个实体的基数

基数是一个属性,它描述了另一个实体的多少元素可以与所讨论的实体相关。在上面的例子中, aPROPERTY可以有一个或多个ROOM与之关联的实例,而 aROOM只能与一个关联PROPERTY在每个基数标记中有两个字符。最外面的字符代表最大值,最里面的字符代表最小值。下表总结了可能的基数。

价值(左) 值(右) 意义
|o o| 零或一
|| || 正是一个
}o o{ 零个或多个(无上限)
}| |{ 一个或多个(无上限)

鉴别

关系可以分为识别或非识别,这些分别用实线或虚线表示。当所讨论的实体之一在没有另一个实体的情况下不能独立存在时,这是相关的。例如,一家为人们驾驶汽车提供保险的公司可能需要在NAMED-DRIVERs 上存储数据。在对此进行建模时,我们可能首先观察 aCAR可以由许多PERSON实例驱动,而 aPERSON可以驱动许多CARs - 两个实体可以在没有另一个的情况下存在,因此这是一种非识别关系,我们可以在代码图中指定为:PERSON }|..|{ CAR : "driver". 请注意关系中间的两个点,这将导致在两个实体之间绘制虚线。但是,当这种多对多关系分解为两个一对多关系时,我们观察到 aNAMED-DRIVER不能同时存在 aPERSON和 a CAR- 关系变得可识别并且将使用连字符指定,连字符转换为实线:

erDiagram
    CAR ||--o{ NAMED-DRIVER : allows
    PERSON ||--o{ NAMED-DRIVER : is

属性

可以通过指定实体名称后跟包含多type name对的块来为实体定义属性,其中块由开始{和结束分隔}例如:

erDiagram
    CAR ||--o{ NAMED-DRIVER : allows
    CAR {
        string registrationNumber
        string make
        string model
    }
    PERSON ||--o{ NAMED-DRIVER : is
    PERSON {
        string firstName
        string lastName
        int age
    }
CARstringregistrationNumberstringmakestringmodelNAMED-DRIVERPERSONstringfirstNamestringlastNameintageallowsis

属性在实体框内呈现:

erDiagram
    CAR ||--o{ NAMED-DRIVER : allows
    CAR {
        string registrationNumber
        string make
        string model
    }
    PERSON ||--o{ NAMED-DRIVER : is
    PERSON {
        string firstName
        string lastName
        int age
    }
CARstringregistrationNumberstringmakestringmodelNAMED-DRIVERPERSONstringfirstNamestringlastNameintageallowsis

typeandname值必须以字母字符开头,并且可以包含数字、连字符或下划线除此之外,没有任何限制,也没有隐式的有效数据类型集。

属性键和注释

属性也可以key定义一个或注释。键可以是“PK”或“FK”,用于主键或外键。acomment由属性末尾的双引号定义。注释本身不能包含双引号字符。

erDiagram
    CAR ||--o{ NAMED-DRIVER : allows
    CAR {
        string allowedDriver FK "The license of the allowed driver"
        string registrationNumber
        string make
        string model
    }
    PERSON ||--o{ NAMED-DRIVER : is
    PERSON {
        string driversLicense PK "The license #"
        string firstName
        string lastName
        int age
    }
CARstringallowedDriverFKThe license of the allowed driverstringregistrationNumberstringmakestringmodelNAMED-DRIVERPERSONstringdriversLicensePKThe license #stringfirstNamestringlastNameintageallowsis

其他事情

  • 如果您希望关系标签超过一个单词,则必须在短语周围使用双引号
  • 如果您根本不需要关系上的标签,则必须使用空的双引号字符串

造型

配置选项

对于简单的颜色定制:

姓名 用作
fill 实体或属性的背景颜色
stroke 实体或属性的边框颜色,关系的线条颜色

使用的类

以下 CSS 类选择器可用于更丰富的样式:

选择器 描述
.er.attributeBoxEven 包含偶数行属性的框
.er.attributeBoxOdd 包含奇数行属性的框
.er.entityBox 代表实体的框
.er.entityLabel 实体的标签
.er.relationshipLabel 关系的标签
.er.relationshipLabelBox 关系标签周围的框
.er.relationshipLine 表示实体之间关系的线