大家好,我是大头,职高毕业,现在大厂资深开发,前上市公司架构师,管理过10人团队!
我将持续分享成体系的知识以及我自身的转码经验、面试经验、架构技术分享、AI技术分享等!
愿景是带领更多人完成破局、打破信息差!我自身知道走到现在是如何艰难,因此让以后的人少走弯路!
无论你是统本CS专业出身、专科出身、还是我和一样职高毕业等。都可以跟着我学习,一起成长!一起涨工资挣钱!
MySQL零基础教程
本教程为零基础教程,零基础小白也可以直接学习,有基础的可以跳到后面的原理篇学习。
基础概念和SQL已经更新完成。
接下来是应用篇,应用篇的内容大致如下图所示。
ER图
接下来讲讲ER图,这个是在实际工作中也会使用到的东西。
大家应该都听过ER图,全称是(Entity Relationship)实体关系图。
借用维基百科的介绍:
ER模型,全称为实体联系模型、实体关系模型或实体联系模式图(ERM)(英语:Entity-relationship model)由美籍台湾人计算机科学家陈品山发明,是概念数据模型的高层描述所使用的数据模型或模式图。
ER图通常用在设计数据库
的阶段,当我们接到一个需求以后,我们要进行一些技术设计
,在这个阶段如果涉及到一些对于数据库的修改,我们可以使用ER图进行设计。
万事万物都有两面性,因此我们看一下好处和坏处,如何使用由大家自己权衡。
- 好处:好处是设计直观、在设计之后也方便给大家讲为什么这样设计,还有留存文档,当后续需要修改设计的时候直接修改即可。
- 坏处:坏处就是需要花时间去画ER图了。
ER图的基本概念
ER图的主要组成部分
- 实体(Entity):
- 实体是数据库中具有相同属性集合的对象。例如,学生、课程、教师等。
- 在ER图中,实体通常用矩形表示,矩形内写上实体的名称。
- 属性(Attribute):
- 属性是实体的特征或性质。例如,学生的属性可以包括学号、姓名、年龄等。
- 在ER图中,属性通常用椭圆表示,椭圆内写上属性的名称,并用线连接到对应的实体。
简单来讲,实体就是一个表,属性就是表里面的一个字段。
下图就是一个ER图
,实体
是管理员用户
。属性
有头像、密码、登录名、ID、邮箱、手机号。
- 关系(Relationship):
- 关系描述了实体之间的联系。例如,学生和课程之间的关系可以是选修。
- 在ER图中,关系通常用菱形表示,菱形内写上关系的名称,并用线连接到相关的实体。
- 关系的类型:
- 一对一关系(1:1):一个实体与另一个实体之间存在一对一的联系。例如,一个学生对应一个学号。
- 一对多关系(1:N):一个实体与多个实体之间存在联系。例如,一个教师可以教授多个课程。
- 多对多关系(M:N):多个实体与多个实体之间存在联系。例如,一个学生可以选修多个课程,一个课程也可以被多个学生选修。
下图就是一个ER图,实体
是管理员用户和角色两个。关系
是拥有
,表示管理员用户拥有角色的关系。关系的类型用m和n
表示多对多关系
。意思是一个管理员用户可以拥有多个角色,一个角色也可以被多个管理员用户拥有。
关系
这个东西,简单来说就是通过两个字段
链接进行实现的。
多对多关系
比如我们有角色
表和管理员用户
表,这两个表,是多对多关系。
所以我们就需要用一张单独的表来存储这个关系。比如我们新建第三个表叫角色和管理员用户关系
表。
角色和管理员用户关系
表有字段内容如下:
- id: 该表的主键。
- roleId: 角色表的主键。用来关联角色信息。
- adminId: 管理员用户表的主键。用来关联管理员用户信息。
可以看到,这个关系就是通过角色和管理员用户关系
的两个字段来表示的。
角色
表内容如下:
id | name |
---|---|
1 | 前台角色 |
2 | 行政角色 |
3 | 开发角色 |
管理员用户
表内容如下:
id | name |
---|---|
1 | 张三 |
2 | 李四 |
角色和管理员用户关系
表内容如下:
根据表的数据我们很清晰的能看出来,张三
既拥有前台角色
也拥有行政角色
,可谓身兼数职。当代牛马。李四
则拥有一个开发角色
。
id | roleId | adminId |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 1 | 2 |
记住上面说的,通过两个字段
链接进行实现的。
这里的两个字段就是roleId
和adminId
。
roleId = 1
表示的是角色表中,id = 1
的前台角色
,对应的数据是adminId = 1
的数据,也就是管理员表中id = 1
的管理员张三
。
如此,我们就知道了,张三拥有角色:前台角色。
一对多关系
一对多关系
和多对一关系
基本一样。就是反过来了。
一个老师可以教授多个课程,比如我们有两个表,一个老师表
,一个课程表
。
一对多关系比较灵活,记住上面说的,通过两个字段
链接进行实现的。
先看老师表的数据如下:
id | name |
---|---|
1 | 张老师 |
2 | 李老师 |
课程表的数据如下:
id | name | teacher_id |
---|---|---|
1 | 语文课程 | 1 |
2 | 数学课程 | 2 |
3 | 英语课程 | 1 |
为什么说一对多关系比较灵活呢,可以看到,我们这里用到的关联字段是老师表的id
和课程表的teacher_id
。而不需要再多加一张表了。
这里要记住一个重点!!!!
多出来的这个teacher_id 字段要放在一对多关系中的 多 的这个表里面。
什么是一对多关系中的多
的关系呢?
比如上面一个老师教多个课程,那么多
的关系就是课程信息。
当然了,如果你想要多加一张表来存储这两个字段的话也是可以的。
比如增加下表,教授课程表,如果增加了这张表,就可以把课程表中的teacher_id
字段删除了:
下表也代表了张老师
教授语文课程和英语课程,李老师教授数学课程。
id | course_id | teacher_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 1 |
一对一关系
一对一关系是最简单的。其实算是一对多关系
的一个真子集
。
为什么这么说呢?
我们假设,一个老师只能教授一个课程,那么上面的两个表是不是就变成了一对一关系
呢?所以我们说一对一关系是一对多关系的一个真子集。
ER图实践
接下来我们来实践一下ER图。
我这里使用的工具是免费的在线画图工具Processon
多对多关系的ER图
首先来画出多对多关系的ER图吧。
以上面的三个表为例子。
我们需要两个实体和一个关系。
- 实体1: 管理员实体,管理员实体后面会转化成管理员表。
- 实体2: 角色实体,角色实体后面会转化成角色表。
- 关系:两个实体之间的多对多关系,多对多关系后期需要转换成一张关系表。
我们首先画出第一个实体,管理员实体
使用矩形表示。如下图。
接下来我们给管理员实体增加属性,属性使用椭圆
来表示,如下图。
现在我们画出第二个实体,角色实体
和对应的属性。
接下来我们画出关系,关系使用棱形
来表示,并且使用线连接两个实体,表示是这两个实体之间的关系。多对多关系还需要在两边分别标记上n
和m
。
此外,关系还要有一个名称,用来描述,比如管理员拥有角色,角色被管理员拥有
。所以我们可以用拥有
关系来描述这两个实体之间的关系。
如此,我们就完成了一个多对多关系的ER图。
一对多关系的ER图
接下来再实践一次一对多关系的ER图,最好大家先动手画一次,再跟我们的结果来对比,只有自己实操了才行。
实操时间。。。。。
好了,实操结束。
我们来看一下一对多关系如何画图。
我们需要两个实体和一个关系。
- 实体1: 教师实体,后面变成教师表。
- 实体2: 课程实体,后面变成课程表。
- 关系:两个实体之间的一对多关系,一对多关系可以是一个字段也可以是一个表。
首先画出第一个实体和属性,也就是教师实体。
接下来画出第二个实体和属性,也就是课程实体。课程实体这里有一个属性是教师ID
,这代表我们使用这个字段,而不是增加了一个关系表。如果我们没有这个字段就代表我们要增加一个关系表。
最后,画出关系并连线。这里关系名称我们选择教授,这个其实无所谓。能明白就好。重点是要标明一对多关系,可以看到教师实体
上写的是1,课程实体
上写的是n,代表一对多关系中,教师是1,课程是多。这个不能写反了。
多对一关系的画起来是一样的,需要注意的就是关系上的1和n别写错了。
一对一关系的ER图
一对一关系的ER图和上面的差不多,我们举个例子吧。
- 实体1: 用户实体,转化成用户表,存储用户信息。
- 实体2: 用户账户实体,转化成用户账户表,存储用户的账号资金信息。
- 关系:一对一关系,一个用户只能拥有一个用户账户。
首先画出第一个实体,用户实体。属性包括ID、用户名称、手机号。
接下来画出第二个实体,用户账户实体,属性包括ID、账户余额、用户ID。用户ID作为关联关系的字段,和一对多关系一样,就不需要单独加表了。
最后,画出关系并连线,标上关系是一对一关系就可以了。
总结
通常来说,ER图是在设计阶段完成的,先有ER图再有表结构。
可如果你已经有了表结构,有没有办法生成ER图呢?
也是有方法的,比如著名的Navicat
工具,就支持这么做。
此外,还有一个方法,就是使用在线工具dbdiagram,这个工具可以导入现有的SQL,会生成ER图,如下。
这个网站是通过左边的一个叫dbml
的语言来生成ER图的,也支持直接导入SQL,转化成dbml格式再生成ER图。