实体关系图
实体关系模型(或 ER 模型)描述特定知识领域中相关的感兴趣的事物。 基本 ER 模型由实体类型(对感兴趣的事物进行分类)组成,并指定实体(这些实体类型的实例)之间可能存在的关系。 维基百科。
请注意,ER 建模的实践者几乎总是将实体类型简称为实体。 例如,CUSTOMER 实体类型将简称为 CUSTOMER 实体。 这种情况很常见,不建议做任何其他事情,但从技术上讲,实体是实体类型的抽象实例,这就是 ER 图显示的内容 - 抽象实例以及它们之间的关系。 这就是为什么实体总是使用单数名词来命名。
美人鱼可以绘制 ER 图
代码:
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
实体名称通常是大写的,尽管对此没有公认的标准,并且在 JHL 在线编辑 中也没有要求。
实体之间的关系由带有表示基数的结束标记的线表示。 美人鱼使用最流行的鱼尾纹表示法。 鱼尾纹直观地传达了它所连接的实体的许多实例的可能性。
ER 图可用于各种目的,从没有任何实现细节的抽象逻辑模型到关系数据库表的物理模型。 在 ER 图上包含属性定义有助于理解实体的目的和含义。 这些不一定需要详尽无遗; 通常一小部分属性就足够了。 美人鱼允许根据其类型和名称来定义它们。
代码:
erDiagram
CUSTOMER ||--o{ ORDER : places
CUSTOMER {
string name
string custNumber
string sector
}
ORDER ||--|{ LINE-ITEM : contains
ORDER {
int orderNumber
string deliveryAddress
}
LINE-ITEM {
string productCode
int quantity
float pricePerUnit
}
在 ER 图上包含属性时,必须决定是否包含外键作为属性。 这可能取决于您尝试表示关系表结构的紧密程度。 如果您的图表是一个逻辑模型,并不意味着暗示关系实现,那么最好将它们排除在外,因为关联关系已经传达了实体关联的方式。 例如,JSON 数据结构可以使用数组实现一对多关系,而无需外键属性。 类似地,面向对象的编程语言可以使用对集合的指针或引用。 即使对于用于关系实现的模型,您也可能会认为包含外键属性会重复关系已经描述的信息,并且不会为实体添加含义。 最终,这是你的选择。
句法
实体和关系
ER 图的 JHL 在线编辑 语法与 PlantUML 兼容,并带有用于标记关系的扩展。 每个语句由以下部分组成:
<first-entity> [<relationship> <second-entity> : <relationship-label>]
Where:
- first-entity 是实体的名称。 名称必须以字母字符开头,还可以包含数字、连字符和下划线。
- 关系描述了两个实体相互关联的方式。 见下文。
- secondary-entity 是另一个实体的名称。
- 关系标签从第一个实体的角度描述关系。
For example:
PROPERTY ||--|{ ROOM : contains
该声明可以理解为一个房产包含一个或多个房间,而一个房间是一个且唯一一个房产的一部分。 可以看到,这里的标签是从第一个实体的角度来看的:属性包含房间,但房间不包含属性。 当从第二实体的角度考虑时,等效标签通常很容易推断出来。 (一些 ER 图从两个角度标记关系,但这在这里不受支持,并且通常是多余的)。
只有声明的第一实体部分是强制性的。 这使得显示没有关系的实体成为可能,这在图表的迭代构建过程中非常有用。 如果指定了语句的任何其他部分,则所有部分都是强制性的。
关系语法
每个语句的关系部分可以分为三个子组件:
- 第一个实体相对于第二个实体的基数,
- 该关系是否赋予“子”实体身份
- 第二个实体相对于第一个实体的基数
基数是描述另一个实体有多少元素可以与相关实体相关的属性。 在上面的示例中,一个 PROPERTY 可以有一个或多个与其关联的 ROOM 实例,而一个 ROOM 只能与一个 PROPERTY 关联。 每个基数标记中有两个字符。 最外面的字符代表最大值,最里面的字符代表最小值。 下表总结了可能的基数。
值(左) | 值(右) | 意思 |
---|---|---|
|o | o| | 0 或者 1 |
|| | || | 正好一个 |
}o | o{ | 零或更多(无上限) |
}| | |{ | 一个或多个(无上限) |
别名
值(左) | 值(右) | Alias for |
---|---|---|
one or zero | one or zero | Zero or one |
zero or one | zero or one | Zero or one |
one or more | one or more | One or more |
one or many | one or many | One or more |
many(1) | many(1) | One or more |
1+ | 1+ | One or more |
zero or more | zero or more | Zero or more |
zero or many | zero or many | Zero or more |
many(0) | many(1) | Zero or more |
0+ | 0+ | Zero or more |
only one | only one | Exactly one |
1 | 1 | Exactly one |
鉴别
关系可分为识别性关系或非识别性关系,分别用实线或虚线呈现。 当所讨论的实体之一不能离开另一个实体而独立存在时,这一点是相关的。 例如,一家为人们驾驶汽车提供保险的公司可能需要存储有关指定驾驶员的数据。 在建模时,我们可能首先观察到一个 CAR 可以由许多 PERSON 实例驱动,而一个 PERSON 可以驱动许多 CAR - 两个实体都可以独立存在,因此这是我们可以在 JHL 在线编辑 中指定的非识别关系 如:人}|..|{ 汽车:“司机”。 请注意关系中间的两个点,这将导致在两个实体之间绘制虚线。 但是,当这种多对多关系解析为两个一对多关系时,我们观察到如果没有 PERSON 和 CAR,NAMED-DRIVER 就不可能存在 - 这些关系变得可识别,并且将使用连字符指定,这意味着 到实线:
Aliases
Value | Alias for |
---|---|
to | identifying |
optionally to | non-identifying |
代码:
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON ||--o{ NAMED-DRIVER : is
属性
可以通过指定实体名称后跟包含多个类型名称对的块来定义实体的属性,其中块由左 { 和右 } 分隔。 属性在实体框内呈现。 例如:
代码:
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
CAR {
string registrationNumber
string make
string model
}
PERSON ||--o{ NAMED-DRIVER : is
PERSON {
string firstName
string lastName
int age
}
类型值必须以字母字符开头,并且可以包含数字、连字符、下划线、圆括号和方括号。 名称值遵循与类型类似的格式,但可能以星号开头,作为指示属性是主键的另一个选项。 除此之外,没有任何限制,也没有隐式的有效数据类型集。
属性键和注释
属性还可以定义键或注释。 键可以是 PK、FK 或 UK,分别表示主键、外键或唯一键。 要在单个属性上指定多个键约束,请用逗号分隔它们(例如 PK、FK)。注释由属性末尾的双引号定义。 注释本身不能包含双引号字符。
代码:
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
CAR {
string registrationNumber PK
string make
string model
string[] parts
}
PERSON ||--o{ NAMED-DRIVER : is
PERSON {
string driversLicense PK "The license #"
string(99) firstName "Only 99 characters are allowed"
string lastName
string phone UK
int age
}
NAMED-DRIVER {
string carRegistrationNumber PK, FK
string driverLicence PK, FK
}
MANUFACTURER only one to zero or more CAR : makes
其他事情
- 如果您希望关系标签超过一个单词,则必须在短语周围使用双引号
- 如果您根本不需要关系上的标签,则必须使用空双引号字符串
造型
配置选项
对于简单的颜色定制:
Name | Used as |
---|---|
fill | 实体或属性的背景颜色 |
stroke | 实体或属性的边框颜色、关系的线条颜色 |
Classes used
以下 CSS 类选择器可用于更丰富的样式:
选择器 | 描述 |
---|---|
.er.attributeBoxEven | 包含偶数行上的属性的框 |
.er.attributeBoxOdd | 包含奇数行上的属性的框 |
.er.entityBox | 表示实体的框 |
.er.entityLabel | 实体的标签 |
.er.relationshipLabel | 关系的标签 |
.er.relationshipLabelBox | 关系标签周围的框 |
.er.relationshipLine | 表示实体之间关系的线 |