跳至内容

实体关系图

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

请注意,ER 建模从业者几乎总是将实体类型简单地称为实体。例如,CUSTOMER 实体类型将简单地称为CUSTOMER 实体。这种情况非常普遍,以至于做任何其他事情都是不明智的,但在技术上,实体是实体类型的抽象实例,这就是 ER 图所显示的内容 - 抽象实例以及它们之间的关系。这就是为什么实体总是使用单数名词命名的原因。

Mermaid 可以渲染 ER 图

实体名称通常大写,尽管对此没有公认的标准,并且在 Mermaid 中也不必这样做。

实体之间的关系由带有末端标记的线条表示,末端标记表示基数。Mermaid 使用最流行的乌鸦脚符号。乌鸦脚直观地传达了与其连接的实体的多个实例的可能性。

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

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

语法

实体和关系

用于 ER 图的 Mermaid 语法与 PlantUML 兼容,并扩展了为关系添加标签的功能。每个语句都包含以下部分

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

其中

  • first-entity 是实体的名称。名称必须以字母字符或下划线(从 v10.5.0+ 开始)开头,还可以包含数字和连字符。
  • relationship 描述了两个实体之间的相互关系。见下文。
  • second-entity 是另一个实体的名称。
  • relationship-label 从第一个实体的角度描述了关系。

例如

    PROPERTY ||--|{ ROOM : contains

此语句可以理解为一个属性包含一个或多个房间,一个房间属于一个且仅一个属性。您可以看到,这里的标签是从第一个实体的角度出发的:一个属性包含一个房间,但一个房间不包含一个属性。从第二个实体的角度考虑时,通常很容易推断出等效标签。(一些 ER 图从两个角度为关系添加标签,但这在这里不支持,通常是多余的)。

只有语句的first-entity 部分是必需的。这使得可以显示没有关系的实体,这在迭代构建图表时很有用。如果语句的任何其他部分被指定,则所有部分都是必需的。

关系语法

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

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

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

值(左侧)值(右侧)含义
|oo|零或一
||||正好一个
}oo{零或更多(无上限)
}||{一或更多(无上限)

别名

值(左侧)值(右侧)别名
一或零一或零零或一
零或一零或一零或一
一或更多一或更多一或更多
一或多一或多一或更多
多(1)多(1)一或更多
1+1+一或更多
零或更多零或更多零或更多
零或多零或多零或更多
多(0)多(0)零或更多
0+0+零或更多
只有一个只有一个正好一个
11正好一个

标识

关系可以分为标识关系或非标识关系,它们分别使用实线或虚线进行渲染。当其中一个实体在没有另一个实体的情况下无法独立存在时,这一点很重要。例如,为人们购买汽车保险的公司可能需要存储有关NAMED-DRIVER 的数据。在对此进行建模时,我们可能会从观察到一个CAR 可以由许多PERSON 实例驾驶,而一个PERSON 可以驾驶许多CAR 开始 - 两个实体都可以独立于另一个实体存在,因此这是一个非标识关系,我们可能在 Mermaid 中将其指定为:PERSON }|..|{ CAR : "driver"。请注意关系中间的两个点,它们将导致在两个实体之间绘制一条虚线。但是,当这种多对多关系解析为两个一对多关系时,我们会观察到NAMED-DRIVER 无法在没有PERSONCAR 的情况下存在 - 关系成为标识关系,并且将使用连字符进行指定,这些连字符将转换为实线

别名

别名
标识
可选地到非标识

属性

可以通过指定实体名称,然后是一个包含多个type name 对的块来为实体定义属性,其中块由一个{ 和一个} 分隔。属性在实体框内渲染。例如

type 值必须以字母字符开头,可以包含数字、连字符、下划线、括号和方括号。name 值与type 遵循类似的格式,但可以以星号开头,作为指示属性是主键的另一个选择。除此之外,没有其他限制,也没有隐含的有效数据类型集。

实体名称别名(v10.5.0+)

可以使用方括号将别名添加到实体。如果提供了别名,则会在图表中显示别名而不是实体名称。

属性键和注释

属性还可以具有key 或注释定义。键可以是PKFKUK,分别代表主键、外键或唯一键。要在单个属性上指定多个键约束,请用逗号(例如,PK, FK)分隔它们。comment 通过属性末尾的双引号定义。注释本身不能包含双引号字符。

其他内容

  • 如果您希望关系标签不止一个词,则必须用双引号将短语括起来
  • 如果您根本不想在关系上添加标签,则必须使用空双引号字符串
  • (v11.1.0+) 如果您希望在关系上添加多行标签,请在两行之间使用<br />"first line<br />second line"

样式

配置选项

对于简单的颜色自定义

名称 用作
填充实体或属性的背景颜色
描边实体或属性的边框颜色,关系线的颜色

使用的类

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

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