概述
entity–relationship model (简称 ER Model) 用于描述特定知识领域中相互关联的事物,基本的 ER 模型由实体类型和他们之间的关系组成
一般我们在 ER 建模的时候,将实体类型简单的叫做实体。但是在技术角度来说,实体是抽象实体类型的实例,因为是具体实例,所以命名的时候,经常使用单数表示。
实体名称通常是大写的,虽然在这方面没有公认的标准,但是这是约定成俗的做法。
ER 模型中,用头尾带有乌鸦脚符号的线条来表示实体之间的关系。
关系
基本数量上的关系 ER 如下所示:
erDiagram
customer }|..|{ delivery_adress : "有多个地址"
customer ||--|{ order : "有多个地址"
order ||--|{ order_detail : "有订单明细"
customer {
int id PK "自增id"
string name "客户姓名"
}
delivery_adress {
int id PK "递增id"
string adress "省市区"
int created_time "创建时间"
}
order {
int id PK "订单id"
int customer_id FK "订单类型"
int created_time "创建时间"
}
order_detail {
int id PK "递增id"
int order_id FK "订单id"
int product_id "商品id"
int product_num "商品数量"
int created_time "创建时间"
}
数量上的关系
这个 ER 模型中,标识的是:
- 一个订单 order 有多个 order_deatil
- 一个订单 order 有 0 个或者 1 个物流信息,还没发货就没有物流信息
这个乌鸦脚的有两个符号组合表示数量关系:
|
表示有一个O
表示 0 个{
表示多个
并且这个两个符号属于或者的关系,相对于关系标签来说(如上面的属于、有),外层的代表是最大是数量,内层的表示最小的数量,例如:
||
,1 个或者 1 个, 就是标识只能一个o|
,表示 0 个或者 1 个
标识和非标识关系(Identifying and Non-Identifying Relationships), 这个关系用于实线和虚线来表示,例如:
- 实线表示标识关系,就是两个实体之间有直接的关系,有外键进行关联,例如 order_detail 通过 order_id 和父表 order 的 id 进行关联
- 虚线标识非标识关系,就是两个实体之间没有直接关系,独立存在,他们的关系需要通过中间表进行连接。例如 customer 和 delivery_address 没有外键进行直接关联起来,一个客户有多个地址,一个地址可以属于多个客户,他们可以分别独立存在
当然,如果要将非标识关系转为标识关系的话,可以建立一个中间实体,例如:
erDiagram
customer ||--|{ customer_deliver_relation : "有多个地址"
delivery_adress ||--|{ customer_deliver_relation : "有多个地址"
customer {
int id PK "自增id"
string name "客户姓名"
}
customer_deliver_relation {
int id PK "递增id"
int customer_id FK "客户id"
int delivery_adress_id FK "地址id"
int created_time "创建时间"
}
delivery_adress {
int id PK "递增id"
string adress "省市区"
int created_time "创建时间"
}
通过创建一个中间实体 customer_deliver_relation,这样 customer 和 customer_deliver_relation,以及 delivery_adress 和 customer_deliver_relation 之间,都是标识关系了。
父子关系
在 ER 图中,有父子关系,并且在 mermaid 中,中间的 label 是相对于第一实体,也就父亲来说的。在 ER 图中的父子关系,可以通过图形的上下位置来确定,上边的是父亲,下边的是孩子。