实体关系图
实体关系模型(或 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
关联。在每个基数标记中,有两个字符。最外层的字符表示最大值,最内层的字符表示最小值。下表总结了可能的基数。
值(左侧) | 值(右侧) | 含义 |
---|---|---|
|o | o| | 零或一 |
|| | || | 正好一个 |
}o | o{ | 零或更多(无上限) |
}| | |{ | 一或更多(无上限) |
别名
值(左侧) | 值(右侧) | 别名 |
---|---|---|
一或零 | 一或零 | 零或一 |
零或一 | 零或一 | 零或一 |
一或更多 | 一或更多 | 一或更多 |
一或多 | 一或多 | 一或更多 |
多(1) | 多(1) | 一或更多 |
1+ | 1+ | 一或更多 |
零或更多 | 零或更多 | 零或更多 |
零或多 | 零或多 | 零或更多 |
多(0) | 多(0) | 零或更多 |
0+ | 0+ | 零或更多 |
只有一个 | 只有一个 | 正好一个 |
1 | 1 | 正好一个 |
标识
关系可以分为标识关系或非标识关系,它们分别使用实线或虚线进行渲染。当其中一个实体在没有另一个实体的情况下无法独立存在时,这一点很重要。例如,为人们购买汽车保险的公司可能需要存储有关NAMED-DRIVER
的数据。在对此进行建模时,我们可能会从观察到一个CAR
可以由许多PERSON
实例驾驶,而一个PERSON
可以驾驶许多CAR
开始 - 两个实体都可以独立于另一个实体存在,因此这是一个非标识关系,我们可能在 Mermaid 中将其指定为:PERSON }|..|{ CAR : "driver"
。请注意关系中间的两个点,它们将导致在两个实体之间绘制一条虚线。但是,当这种多对多关系解析为两个一对多关系时,我们会观察到NAMED-DRIVER
无法在没有PERSON
和CAR
的情况下存在 - 关系成为标识关系,并且将使用连字符进行指定,这些连字符将转换为实线
别名
值 | 别名 |
---|---|
到 | 标识 |
可选地到 | 非标识 |
属性
可以通过指定实体名称,然后是一个包含多个type name
对的块来为实体定义属性,其中块由一个{
和一个}
分隔。属性在实体框内渲染。例如
type
值必须以字母字符开头,可以包含数字、连字符、下划线、括号和方括号。name
值与type
遵循类似的格式,但可以以星号开头,作为指示属性是主键的另一个选择。除此之外,没有其他限制,也没有隐含的有效数据类型集。
实体名称别名(v10.5.0+)
可以使用方括号将别名添加到实体。如果提供了别名,则会在图表中显示别名而不是实体名称。
属性键和注释
属性还可以具有key
或注释定义。键可以是PK
、FK
或UK
,分别代表主键、外键或唯一键。要在单个属性上指定多个键约束,请用逗号(例如,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 | 表示实体之间关系的线 |