Skip to content

实体关系图

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

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

Mermaid 可以渲染 ER 图

Code:
mermaid

实体名称通常大写,尽管对此没有公认的标准,在 Mermaid 中也不是必需的。

实体之间的关系用带端标记的线表示,端标记表示基数。Mermaid 使用最流行的 crow's foot 表示法。crow's foot 直观地传达了它连接到的实体的许多实例的可能性。

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

Code:
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{零或多个(无上限)
}||{一或多个(无上限)

别名

左侧值右侧值别名
one or zeroone or zero零或一
zero or onezero or one零或一
one or moreone or more一或多个
one or manyone or many一或多个
many(1)many(1)一或多个
1+1+一或多个
zero or morezero or more零或多个
zero or manyzero or many零或多个
many(0)many(0)零或多个
0+0+零或多个
only oneonly one正好一个
11正好一个

标识

关系可以分类为标识或非标识,并分别以实线或虚线渲染。当相关实体之一不能独立存在于另一个实体之外时,这很重要。例如,一家为驾驶汽车的人投保的公司可能需要存储有关 NAMED-DRIVER 的数据。在建模这一点时,我们可能会首先观察到一辆 CAR 可以由许多 PERSON 实例驾驶,一个 PERSON 可以驾驶许多 CAR - 两个实体都可以独立存在,所以这是一个非标识关系,我们可以在 Mermaid 中将其指定为:PERSON }|..|{ CAR : "driver"。请注意关系中间的两个点,它们将导致在两个实体之间绘制虚线。但是当这种多对多关系解析为两个一对多关系时,我们观察到 NAMED-DRIVER 不能同时没有 PERSONCAR - 关系变成标识的,并且将使用连字符指定,这些连字符转换为实线:

别名

别名
to标识的
optionally to非标识的

属性

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

Code:
mermaid

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

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

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

Code:
mermaid

属性键和注释

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

Code:
mermaid

其他事项

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

样式

配置选项

对于简单的颜色自定义:

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

使用的类

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

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