ER图是啥?

article/2025/5/1 17:13:19

文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号


E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。


用矩形表示实体型,矩形框内写明实体名;用椭圆表示实体的属性,并用无向边将其与相应的实体型连接起来;用菱形表示实体型之间的联系,在菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n或m:n)。


实体联系模型,是概念数据模型的高层描述所使用的数据模型或模式图,它为表述这种实体联系模式图形式的数据模型提供了图形符号。


下面是一个最常见的ER图,基本上只要讲解ER图就会碰到它。



通俗的讲,ER图是把现实生活中的各种关系,以图片的形式,抽象出来,形成一个思维导图,通过ER图可以了解现实中的各种关系,比如一个班有很多学生组成。


ER图的应用,最最难的地方我觉得是抽象思维能力,你需要把现实生活中各种关系映射到大脑里面,然后以ER图的形式输出可分析和可视化的东西。


通过实例来拆解ER图


一、学校里的那点事儿


现实生活


一个班级有N多的学生组成,每个班级有一个班级号,每一名学生有一个学号;学生可以根据自己的兴趣爱好选修课程,对于选修的课程需要考试,然后出成绩有学分;一名老师可以教授几门课程。


ER图


通过现实的描述分解出几个实体,分别为班级、学生、课程、教师。出现了几组关系,分别为一个班级由多名学生组成(1对多)、一名学生可以选多门课程,同时一门课程可能被多名学生选修(多对多)、一名教师可传授多门课程,同时一门课程可能被多名教师传授(多对多)。这个场景里面没有一对一的关系。



关系数据库


ER图画出来以后,如何映射到关系数据库中的表呢?这一步就非常简单了,分步骤进行创建:把实体映射为表、把关系映射为表。实体映射为表,比较简单,不再赘述。


关系映射为表,相对来说比较复杂,以这里的ER图为例,存在1对多和多对多两类关系。


1对多或者多对1时,在多方添加一个外键,对应到1方,如学生表里的所在班级这个外键。多对多时,需要新增一个关系表,把两个实体间的关系记录下来,比如下面的学生选课关系表、教师任课关系表。根据ER图创建表如下:


班级表(主键:班级号 


班级号 班级名 专业 人数

C001   动漫一班 动漫设计  60

C002   动漫二班 动漫设计  80

C003   计算一班 计算机应用 70


学生表(主键:学号,外键:所在班级 


学号 姓名 性别 年龄 所在班级

S001 小明 男  20 C001

S002 小王 女  19 C002

S003 小朱 男  21 C003


课程表(主键:课程


课程号 课程名 课时 学分 

K001 PS  20 5

K002 玛雅 25  6

K003 数据库 30  10


教师表(主键:编号)


编号 职称 姓名 性别 年龄

T001 助教 李老师 男  30

T002 讲师 朱老师 女  33

T003 教授 王老师 男  43


学生选课关系表


编号 学号 课程号 成绩

SK001 S001 K001  80

SK002 S001 K002  76

SK003 S002 K001  89

SK004 S003 K002  90


教师任课关系表


编号 教师号 课程号 时间

TK001 T001 K001  16:00

TK002 T001 K002  14:00

TK003 T002 K001  10:00

TK004 T003 K002  15:00


二、说说电商


现实生活


我打开淘宝,登录我的账户,查看了一下昨天下的单快递到哪里了,然后又逛了逛,把几个中意的小家电放到购物车里面,这次钱不够了,下次再买,嘿嘿。


ER图


通过上面简短的描述分解出几个实体,分别为用户、订单、购物车、商品、供应商。出现了几组关系,分别为一个用户会有多个订单(1对多)、一名用户只有一个购物车(1对1),一个购物车选购多种商品,同时一个商品可能存在多个用户的购物车中(多对多)、一个供应商可以供应多种商品,一个商品只能属于一个供应商(多对1)。



关系数据库


同理,根据ER图映射到数据库表,实体首先映射,然后再映射关系,1对1、1对多以及多对1以主外键的形式进行关系映射,多对多以新增一个关系表来进行关系映射。根据ER图创建表如下:


用户表(主键:用户ID


用户ID 用户名 密码 昵称 身份证

U001   USER01 *** 小马哥  3729***

U002   USER02 *** 购物狂  1010***

U003   USER03 *** 买买买  3302***


订单表(主键:订单ID,外键:用户ID


订单ID 用户ID 金额 状态

D001 U001 500¥ 完成

D002 U001 600¥ 派送中

D003 U003 700¥ 待评价


购物车表(主键:购物车ID)


购物车ID 用户ID 总 优惠价

C001 U001 50¥    45¥

C002 U002 150¥ 120¥

C003 U003 50¥    40¥


供应商表(主键:注册号)


注册号 名称 联系人

G001 xx电器公司  高先生

G002 yy洗化公司  李先生

G003 zz服装公司  王先生      


商品表(主键:编码,外键:供应商注册号


编码 名称 分类 重量  单价  供应商注册号

P001 热水壶 家电 1kg 50¥ G001

P002 洗衣粉 洗化 3kg 20¥G001

P003 毛衣     服装 400g 150¥G002


选购关系表


编号 购物车ID 商品编码

X001 C001 P001

X002 C001 P002

X003 C002 P001

X004 C003 P002


三、你真的理解1对1、1对多和多对多吗?


要想彻底理解这三类关系,不能只读理论定义,而是从SQL查询结果出发,来从实践层面加深理解。


1对1,在任意一张表中添加外键



1对1的意思是指第一张表中的某条记录,根据主外键关联,只能查询到另一张表中的0条或者1条记录,同时表中的所有其他记录都满足这个特性,反之亦然。


1对1时,需要添加一个外键,外键添加到任何一张表中都可以。


1对多,1方属于主表,多方属于从表,在从表添加外键



1对多的意思是指第一张表中的某条记录,根据主外键关联,能查询到另一张表中的0条、1条或者N条记录,同时表中的所有其他记录都满足这个特性,反之是多对1。


1对多时,以1方为主表,多方为从表,在多方添加一个外键。


多对多,新增一张关系表


多对多的意思是指第一张表中的某条记录,根据主外键关联,能查询到另一张表中的0条、1条或者N条记录,同时表中的所有其他记录都满足这个特性,反之亦然。


多对多时,要新增一张关系表,以记录多对多的数据关系,举个栗子:


课程表(主键:课程


课程号 课程名 课时 学分 

K001 PS男  20 5

K002 玛雅 25  6

K003 数据库 30  10


教师表(主键:编号)


编号 职称 姓名 性别 年龄

T001 助教 李老师 男  30

T002 讲师 朱老师 女  33

T003 教授 王老师 男  43


教师任课表(多对多关系衍生出来的表)


编号 教师号 课程号 时间

TK001 T001 K001  16:00

TK002 T001 K002  14:00

TK003 T002 K001  10:00

TK004 T003 K002  15:00



如果大家有兴趣,可以试着分析下面ER图如何建表,下篇文章公布答案。






http://chatgpt.dhexx.cn/article/FMi8MxQX.shtml

相关文章

ER图是什么?

ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。 ER图的实体(entity)即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示&#xff…

实体关系 (ER) 图的几种不同风格的符号

什么是 ER 图? 实体关系 (ER) 图是一种流程图,用于说明“实体”(如人、对象或概念)如何在系统中相互关联。ER 图最常用于设计或调试软件工程、商业信息系统、教育和研究领域的关系数据库。也称为 ERD 或 E…

【C】C语言int型数组转化为char型字符串数组

文章目录 C语言int型数组转化为char型字符串数组一、代码二、结果三、说明 C语言int型数组转化为char型字符串数组 一、代码 /* 程序功能&#xff1a;int型数组转化为char型字符串数组*/ #include <stdio.h> #include <stdlib.h> #include <math.h> int nu…

C语言:int型数据向char型数据的强制类型转换原理

int型数据向char型数据强制转换原理 C语言中int是四个字节&#xff0c;char是1个字节&#xff0c;占字节多的int型向字节少的char型强制类型转换的原理就是字节截断。 转换时系统会自动删除高位的三个字节&#xff0c;只留下低位的一个字节&#xff0c;这就是int型想char型转换…

数据类型的大小(int型为例)

上图 int型能表示的范围是-2147483648&#xff08;-215&#xff09; – 2147483647(215 -1) int型占系统分配的4个字节&#xff08;不同系统不一样&#xff09;8个位&#xff0c;最高一位为符号位。10000000时表示-215 、01111111时表示215 - 1 unsigned int 为无符号整型范围…

【C】C语言判断字符串是否是int型正整数

文章目录 【C】C语言判断字符串是否是int型正整数前言一、代码二、结果 【C】C语言判断字符串是否是int型正整数 前言 此程序功能主要是实现&#xff1a;判断在CMD下输入的字符串是是否是int型的正整数。 在判断字符是数值时还可以了解一下isdigit()函数&#xff0c;可…

C:int型指针

2019独角兽企业重金招聘Python工程师标准>>> 环境:mint 13 64bit,gcc 4.6.3。 如无特殊,均为`gcc test.c -o test`的类似方式编译源文件。 在这里主要讨论`int*`,`int**`,`char*`,`char**`等这些比较基本的指针类型,主要以int类型为示例。在64bit环境中地址用…

java float强制转换int类型_float型怎样强制转换成int型

展开全部 运行时所有数据都存储在内存中&#xff0c;32313133353236313431303231363533e4b893e5b19e31333436316236所以相同很正常&#xff0c;float转int会将小数后面的数舍去。 比如定义了一个floata&#xff0c;强制转换成int可写成(int)a。如果是一个表达式&#xff0c;那么…

mysql int 可以是负数吗_int型包括负数吗

展开全部 可以包含负值也可以不包含负值。 在计算机科学中&#xff0c; int()函数是整e69da5e887aa62616964757a686964616f31333433623235数数据类型的数据&#xff0c;积分数据类型可以具有不同的大小&#xff0c;并且可以允许或不允许包含负值。 整数通常在计算机中表示为一组…

int型溢出问题

目录 问题原理奇怪的循环计算机的编码循环的产生 如何识别溢出乘法加法 参考文献 问题 在执行乘法时&#xff08; i ! ∗ 2 i , ( i 0 , 1 , . . . , n − 1 ) i!*2^{i},(i0,1,...,n-1) i!∗2i,(i0,1,...,n−1)&#xff09;&#xff0c;当计算的值超过了int上限后却变成了负数…

C++中int型和string型的相互转换

一、int型转string型 1、to_string函数&#xff0c;头文件#include<string> c11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_s…

ArcGIS:使用栅格计算器修改特定条件下的值,如将小于100的数修改为0

使用ArcGIS中的栅格计算器可以将特定条件的值进行修改&#xff0c;如原来栅格值的范围为10-1000&#xff0c;可以通过条件语句将其修改为10-100。 修改的时候需要用到栅格计算器中的con条件语句&#xff0c;用法如下&#xff1a; con(条件,满足条件的部分赋值赋值,不满足条件的…

arcgis栅格计算器python教程_arcgis栅格计算器的使用

原标题&#xff1a;arcgis栅格计算器的使用 arcgis栅格计算器的使用 栅格计算器的灵活运用可以解决获取的数据的很多问题和应用。 以dem高程数据为例&#xff0c;可以运用栅格计算器可以直接获取坡度坡向等结果&#xff0c;但是很多时候是需要连续计算多次获得想要的结果。 …

arcgis栅格计算器:将栅格图层指定值设置为Nodata及栅格图层求交

1. 首先需要找到栅格计算器的位置 2. 将栅格图层的某个数据设置为Nodata setnull函数可将特定的栅格值赋值为空值 SetNull("这里是栅格图像名称"0 & 4,1)说明&#xff1a; 将栅格图像中0和4的栅格设置为Nodata&#xff0c;并将其他值设置为1。 结果显示&#x…

【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。在使用的过程中,容易出现这样那样的问题,本文就把栅…

C# VS2010 ArcEngine 栅格计算器

本来一开始我的想法是把栅格计算器中的几种功能都封装起来&#xff0c;最后拼成栅格计算器的完整功能&#xff0c;但在实践过程中我不得不面对&#xff0c;这样造成的代码的复杂度上升&#xff0c;公式只能一步步计算的问题。最终使用了GP工具中的RasterCalculator。 注意&…

arcgis栅格计算器python教程_ArcGIS教程:栅格计算器

摘要 在类似计算器的界面中&#xff0c;使用Python语法构建和执行单个地图代数表达式。 插图 用法 栅格计算器工具用于创建和执行地图代数表达式以输出一个新的栅格数据。 可在图层和变量列表中选择要用在表达式中的数据集和变量。并且&#xff0c;通过在工具对话框中单击相…

arcgis 利用栅格计算器计算 土地转移矩阵

可以前往“地信遥感数据汇”获取更多数据。 https://www.gisrsdata.com/ 如果你要做土地利用变化的研究&#xff0c;那就会用到土地转移矩阵。而土地利用转移矩阵常规有两个办法。 第一种办法就是利用ENVI里面的change detection statics工具。 第二种办法就是利用arcgis里面…

基于arcgis栅格计算器进行连续时间序列NDVI的Slope趋势分析

一、趋势分析法简介 趋势分析法是一种通过对随时间变化的变量进行线性回归分析&#xff0c;从而来预测其变化趋势的方法。其计算方法如下&#xff1a; 式中&#xff0c;Slope为像元回归方程的斜率&#xff0c;NDVI i为第i年的NDVI的平均值&#xff0c;n为研究的时间长度,视自…

【使用ArcGIS的栅格计算器批量计算波段】

使用ArcGIS的栅格计算器批量计算波段 一、先建立一个模型1.1 创建变量 二、将栅格计算器工具拖进模型里面&#xff0c;将路径安排好。保存模型。三、勾选模型参数。四、在目录里面找到该模型&#xff0c;右键选择 “批处理”五、将这一行选中&#xff0c;粘贴中Excel中六、根据…