Skip to content

实体关系图

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

请注意,ER建模的实践者几乎总是将实体类型简称为实体。例如,CUSTOMER实体类型将简称为CUSTOMER实体。这种做法非常普遍,不建议做其他处理,但从技术上讲,实体是实体类型的抽象实例,而ER图展示的正是这些抽象实例及其之间的关系。这就是为什么实体总是使用单数名词命名的原因。

Mermaid 可以渲染 ER 图

实体名称通常大写,尽管在这方面没有公认的标准,而且在Mermaid中也不是必需的。

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

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

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

语法

实体和关系

Mermaid语法用于ER图与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{零个或多个(无上限)
}||{一个或多个(无上限)

别名

值(左)值(右)别名
一或零一或零零或一
零或一零或一零或一
一个或多个一个或多个一个或多个
一个或多个一个或多个一个或多个
many(1)many(1)一个或多个
1+1+一个或多个
零个或多个零个或多个零个或多个
零或多个零或多个零或多个
many(0)many(0)零个或多个
0+0+零个或多个
只有一个只有一个恰好一个
11恰好一个

识别

关系可以分为标识非标识,并分别用实线或虚线表示。当其中一个实体在没有另一个实体的情况下无法独立存在时,这一点就很重要。例如,一家为人们提供汽车驾驶保险的公司可能需要存储NAMED-DRIVER的数据。在建模时,我们可能会首先观察到,一个CAR可以由多个PERSON实例驾驶,而一个PERSON可以驾驶多个CAR——这两个实体都可以在没有对方的情况下存在,因此这是一个非标识关系,我们可以在Mermaid中指定为:PERSON }|..|{ CAR : "driver"。注意关系中间的两个点,这将在两个实体之间绘制一条虚线。但是,当这种多对多关系被分解为两个一对多关系时,我们观察到,如果没有PERSONCARNAMED-DRIVER就无法存在——这些关系变成了标识关系,并将使用连字符指定,这将被转换为实线:

别名

别名
to识别
可选地非标识

属性

可以通过指定实体名称后跟一个包含多个type name对的块来为实体定义属性,其中块由开头的{和结尾的}界定。属性在实体框内呈现。例如:

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

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

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

属性键和注释

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

其他事项

  • 如果您希望关系标签包含多个单词,必须使用双引号将短语括起来
  • 如果你不想在关系上显示任何标签,你必须使用一个空的双引号字符串
  • (v11.1.0+) 如果你想在关系上显示多行标签,可以在两行之间使用
    ("第一行
    第二行"
    )

样式

配置选项

对于简单的颜色自定义:

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

使用的类

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

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