实体关系图
实体关系模型(或 ER 模型)描述特定知识领域中相互关联的感兴趣事物。基本的 ER 模型由实体类型(对感兴趣的事物进行分类)组成,并指定实体(这些实体类型的实例)之间可能存在的关联关系 维基百科。
请注意,ER 建模的实践者几乎总是将实体类型简单地称为实体。例如,CUSTOMER
实体类型将简称为 CUSTOMER
实体。这非常普遍,以至于不这样做是不明智的,但在技术上,实体是实体类型的抽象实例,这就是 ER 图所显示的内容 - 抽象实例及其之间的关系。这就是为什么实体总是使用单数名词命名的原因。
Mermaid 可以渲染 ER 图
Code:
实体名称通常大写,尽管对此没有公认的标准,在 Mermaid 中也不是必需的。
实体之间的关系用带端标记的线表示,端标记表示基数。Mermaid 使用最流行的 crow's foot 表示法。crow's foot 直观地传达了它连接到的实体的许多实例的可能性。
ER 图可用于各种目的,从没有任何实现细节的抽象逻辑模型到关系数据库表的物理模型。在 ER 图上包含属性定义有助于理解实体的目的和含义。这些并不一定需要详尽无遗;通常只需要一小部分属性就足够了。Mermaid 允许根据它们的类型和名称来定义它们。
Code:
在 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
关联。在每个基数标记中,有两个字符。最外面的字符表示最大值,最里面的字符表示最小值。下表总结了可能的基数。
左侧值 | 右侧值 | 含义 |
---|---|---|
|o | o| | 零或一 |
|| | || | 正好一个 |
}o | o{ | 零或多个(无上限) |
}| | |{ | 一或多个(无上限) |
别名
左侧值 | 右侧值 | 别名 |
---|---|---|
one or zero | one or zero | 零或一 |
zero or one | zero or one | 零或一 |
one or more | one or more | 一或多个 |
one or many | one or many | 一或多个 |
many(1) | many(1) | 一或多个 |
1+ | 1+ | 一或多个 |
zero or more | zero or more | 零或多个 |
zero or many | zero or many | 零或多个 |
many(0) | many(0) | 零或多个 |
0+ | 0+ | 零或多个 |
only one | only one | 正好一个 |
1 | 1 | 正好一个 |
标识
关系可以分类为标识或非标识,并分别以实线或虚线渲染。当相关实体之一不能独立存在于另一个实体之外时,这很重要。例如,一家为驾驶汽车的人投保的公司可能需要存储有关 NAMED-DRIVER
的数据。在建模这一点时,我们可能会首先观察到一辆 CAR
可以由许多 PERSON
实例驾驶,一个 PERSON
可以驾驶许多 CAR
- 两个实体都可以独立存在,所以这是一个非标识关系,我们可以在 Mermaid 中将其指定为:PERSON }|..|{ CAR : "driver"
。请注意关系中间的两个点,它们将导致在两个实体之间绘制虚线。但是当这种多对多关系解析为两个一对多关系时,我们观察到 NAMED-DRIVER
不能同时没有 PERSON
和 CAR
- 关系变成标识的,并且将使用连字符指定,这些连字符转换为实线:
别名
值 | 别名 |
---|---|
to | 标识的 |
optionally to | 非标识的 |
属性
可以通过指定实体名称后跟一个包含多个 type name
对的块来定义实体的属性,其中块由一个开括号 {
和一个闭括号 }
分隔。属性在实体框内呈现。例如:
Code:
type
值必须以字母字符开头,可以包含数字、连字符、下划线、括号和方括号。name
值的格式与 type
类似,但也可以以星号开头作为另一个选项,以指示属性是主键。除此之外,没有其他限制,也没有隐含的有效数据类型集。
实体名称别名 (v10.5.0+)
可以使用方括号向实体添加别名。如果提供,则图表中将显示别名而不是实体名称。
Code:
属性键和注释
属性还可以定义 key
或注释。键可以是 PK
、FK
或 UK
,分别代表主键、外键或唯一键。要在单个属性上指定多个键约束,请用逗号分隔它们(例如,PK, FK
)。comment
由属性末尾的双引号定义。注释本身不能包含双引号字符。
Code:
其他事项
- 如果要使关系标签不止一个词,则必须在短语周围使用双引号
- 如果根本不想要关系上的标签,则必须使用空双引号字符串
- (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 | 代表实体之间关系的线 |