十秒搞懂ER图中的对应关系
- ER图是什么
- 实体是什么
- 关系
- 如何确认实体间的关系
- 简单总结
ER图是什么
实体关系图
(Entity-Relationship Diagram,简称ER图
)是一种图形化的工具
,用于表示数据库中不同实体之间的关系和连接
。ER图是数据库设计中常用的一种方法,旨在帮助人们可视化和理解数据模型、实体之间的联系以及数据流动
。
在ER图中,实体用矩形表示
,属性用椭圆或矩形中的文本表示
,关系用菱形
表示,线条表示实体之间的连接和关系
。ER图提供了一种直观的方式来描述实体、属性和关系之间的结构,从而使数据库设计人员、开发人员和其他相关人员更容易共享和沟通数据库的设计意图。
实体是什么
上面描述中我们提到了实体,那么实体到底是什么呢?
在数据库设计中,“实体
” 是指现实世界中独立存在并具有独特属性的事物或对象
。每个实体都可以在数据库中表示为一个表
,而每个表的行
则对应于实体的具体实例
。
实体可以是物理对象
,如人、车辆、产品
等,也可以是抽象概念
,如订单、课程、事件
等。每个实体通常具有一些属性,这些属性用于描述实体的特征。例如,一个 “人” 实体可能具有属性如姓名、年龄、性别等。
关系
那么实体间的关系,有哪些呢
在数据库设计中,一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)
是常见的实体关系类型,用于描述不同实体之间的连接和关系。下面我会详细解释每种关系,并举例说明:
一对一关系(One-to-One):
一对一关系表示一个实体在一个表中与另一个实体在另一个表中存在唯一对应关系
。每个实体在一个表中只能与一个实体在另一个表中关联
,反之亦然。这种关系常用于描述具有一一对应关系的情况,如身份证与个人信息之间的关系。
具体到数据库中的具体表现为:
举例:假设有一个 “人员” 表和一个 “身份证” 表,每个人员只有一个唯一的身份证号,每个身份证号也只对应一个人员。
一对多关系(One-to-Many):
一对多关系表示一个实体在一个表中可以与多个实体在另一个表中关联
。每个实体在一个表中
可以对应多个
实体在另一个表中,但每个实体在另一个表中只能关联一个实体
。这种关系常用于描述主表与从表之间的关系,如客户与订单之间的关系。
具体到数据库中的具体表现为:
举例:假设有一个 “客户” 表和一个 “订单” 表,每个客户可以拥有多个订单,但每个订单只属于一个客户。
多对多关系(Many-to-Many):
多对多关系表示多个实体在一个表中可以与多个实体在另一个表中关联
。这种关系需要使用一个中间表来建立连接,中间表中存储了两个实体之间的对应关系
。这种关系常用于描述多对多关联的情况,如学生与课程之间的关系。
具体到数据库中的具体表现为:
举例:假设有一个 “学生” 表和一个 “课程” 表,一个学生可以选择多门课程,而一门课程也可以被多名学生选择。这种关系需要使用一个中间表来记录学生和课程之间的对应关系。
如何确认实体间的关系
看完以后是不是,觉得脑子有点大,不太清楚怎么确定关系?没事,我当时遇到也是这样,不过在我绞尽脑汁以后,终于悟出来了!如何快速确定关系!
具体的办法就是,使用连接 - join on
确定各实体间的关系。比如现在我现在有一张学生表(student)、一张课程表(class)、一张教师表(teacher)
,现实逻辑是,学生可以选择课程,老师可以执教课程
。
如何快速确定其中的学生 - 课程、课程 - 老师
的关系呢?
很简单,用学生表里面的一条数据左联接查询课程表里面的数据:
select * from student left join class on student.classID = class.ID
where student.ID = 1001
如果返回多行,说明学生表和课程表是一对多的关系
,表示一个学生可以选择多门课程。然后我们再反向左连接一下,用课程表里面的一条数据,左连接一个学生表的数据:
select * from class left join student on class.ID = student.classID
where class.ID = 202310031
如果返回多行,说明课程表和学生表也是一对多的关系
,表示一个课程可以有多个学生参与。
那么表明两个表中的每一行对应另一表中的多行数据
,这就很简单了,很明显符合上面描述的:
学生 - 课程
的关系就是多对多关系
了。
以上述方法确定 老师 - 课程
关系,
select * from teacher left join class on teacher.ID = class.teacherID
where teacher.ID = 20230012
返回多行结果,表明一个老师可以执教多门课程,一对多关系
select * from class left join teacher on class.teacherID = teacher.ID
where class.ID = 202310031
返回一行结果,表明一门课程只能有一个教师执教,一对一关系
。
综合上述的结果,很明显符合上图中的:
那么这里的老师 - 课程关系就是一对多关系了
。
简单总结
两个结果返回的情况以及对应关系:
都是一行,那就是一对一关系
其中一个为多行,另一个为一行,那就是一对多关系
都是多行跟多行,那就是多对多关系
下课!