00:01
好,前面的话呢,咱们给大家介绍了常见的数据库啊,以及呢,我们还提到了关系型数据库和非关系型数据库的一个对比,那大家呢,心里边儿做到有数就可以了啊,作为一个整体的了解就行,那下边的话呢,我们来再看下个问题,还回到咱们的关系型数据库上。那关系数据库啊,咱们上面提到了这个,呃,它把复杂世界中的这种数据结构啊,使用这种二元关系,也是我们说的二维表格呢来进行刻画,那二维表格的话呢,就是我们放到数据库当中,就提到了这个典型的结构就是数据表,就是大家能看到的,比如说这张表。那这个表当中啊,我们说是有行有列对吧,那么这个一行数据其实呢,就是对应着我们就一条记录吧,就是我们说的一条记录,那我们把这个数据呢,放到一个表当中啊,很多条数据就构成了一张表,那么这个表呢,我们再把它放在这个库当中。啊,放到这个具体的库当中就构成了,我们说那个DB前面也提到一个概念,对吧,就是数据库文件嘛,啊那么反过来来讲呢,说一个数据库呢,就可以有多张表,每个表有一个自己的名字,用来标识唯一的标识自己,这个呢也很好理解啊,你就比如说咱们这个在大家提到的。
01:15
咱还回过去,稍微让大家看一眼,Program data里边,我们找到这个MYSQL,找到咱们这个8.0这个data里边,诶,每一个文件夹其实都是一个具体的数据库,那么这个所谓的数据库,我们打开以后,每一个这个文件其实都是一个数据表,那么我们能发现的就是这些表的名字一定是不同的。那你也能想到,比如说我们要是使用这个circlel去做这个查询操作呢,那如果我们出现两个表明一样的话,那就没法区分到底用的是谁了,对吧?哎,是这样的一个问题,OK,行,那咱们一般呢,在实际开发当中啊,一个呃,项目当中,比如说呢,大家开发一个电商的一个项目,那一个电商的项目呢,我们会把它分成几个模块啊,不同的模块对应着不同的服务,然后我们就有可能会对应着有多个库。
02:03
以前传统的话呢,我们都会对应的只有一个库,那现在呢,我们说这个呃,有了这种像呃分布式之后呢,我们实际上可以对应的有多个数据库,那我们这里边所谓的数据库,你就可以理解成类似于我们这里边儿的一个文件夹一样,那一个文件夹里边我们在存储多张表,像一个项目当中可能几百张表啊,都是非常正常的。OK,行,那我们再拉回来。说呀,这个表它具备一定的特征,这些特征呢,定义了数据在表中是如何进行存储的,哎,像我们下边呢,提到这种ER模型,哎,就算是一些特征了,那后续呢,咱们这个展开讲解这个circle的时候,还会讲解非常多的一些特征啊,像典型的这种约束等等的是吧。那么我们这里边儿提到这个表啊,说类似于Java或者Python当中类的设计啊,这里边儿我们引入了这个编程的语言了。那尽量呢,我在讲课过程当中啊,给大家呃,少引用一些这个编程语言啊,为啥呢?因为咱们是零基础学习数据库的,有可能大家不一定接触过我们说的这种编程语言,对吧?所以呢,尽量少给大家提,那凡是涉及到我们一些举例的场景呢,我可以呢,去拿生活中的一些例子给大家去做对比。
03:13
OK,那么这里边儿呢,我们在这一块内容还不得不提,为什么呀,因为大家如果学了数据库,或者你之前接触过Java和Python啊,再或者说呢,你以后要学习Java或Python,那这里边呢,会涉及到我们后续用编程语言来操作数据库的时候,对应的有一种关系,这种关系呢,我们成为了哎,OM的这样一种映射。来我这块呢,简单来写一下,后续呢,大家如果接触到像Java这样的编程语言,会提到这个OM这样一个思想的,那这个所谓的OM呢,当然一看也是单词的缩写了,O呢就是object的意思,这个二呢就是relational,然后M呢就是mapping,叫对象关系映射,对吧?这里边提到了一个点,是不是我们说表啊,类似于Java或者Python这样面向对象语言中这个类的设计啊,所以我们就可以理解成什么呀,就是我们数据库中的一个表,它呢就跟哎我们说的,呃,这个我们说的是实际上什么样对象语言了,也不管是这个Java了啊,哎,跟我们Java,我这样说吧,或者是。
04:18
这属于面向对象语言,这个语言当中的啊,一个类啊,是存在这种对应关系的。啊,是存在这种对应关系的,就比如说我们这样的一个表是吧,对应着我们想,哎,Java当中就是一个类的概念,那么表里边呢,咱们说二维关系嘛,哎,二维这个表格里边就有行和列,那么行的话呢,我们说称为呢,叫一个肉,或者呢叫一个record,就是一个记录,那我们这样写说表中的一条数据。啊,我们叫一个肉或者一个record,或者叫一条记录,它呢就跟谁呀,咱们Java或者是Python中类的一个,哎,对象对应啊类中的啊一个对象或者这个对象呢,我们也可以称为呢,叫一个实体,实体呢就是N体啊就是还是它的这个意思。
05:10
啊,就是一个实体去对应好,然后再接着,那这是我们说的这个行的这种关系了,对吧,然后呢,我们再来看这种列的关系,那列的关系呢,我们相当于就是表中的一个列对吧。来表中的一个列。那一个列跟谁对应呢?那这一个列呢,如果大家你接触过Java或者是Python的话呢,那我们相当于是对应着类当中的一个field啊,我们叫一个字段类中的。啊,一个字段,这个用英文来表示的话呢,基本上没有歧义,我们就叫field了,那只不过我们平时讲编程语言的时候呢,习惯上啊,把这个字段呢,都翻译成这个属性了,叫属性叫的都挺溜的,大家如果接触过Java或Python呢,通常也都知道是吧,但是严格上来讲呢,我们说属性呢,翻译成英文,人家其实叫attribute,那包括我们看这个,呃,像Java中的一个字节码文件的时候呢,这个attribute这个属性呢,它有专门的意思,就是属性跟字段呢,完全是两个概念。
06:12
那这个是因为以前这个前这个前辈们是吧,在翻译的时候呢,把field呢就给讲成属性了,所以导致我们一直延续到现在,大家习惯上也叫属性,但是注意严格上来说呢,我们翻译成字段是更加的精准的。好,那么我们这里呢,提到了这三条,这三条呢,其实就是我们OM这种思想的一个体现了,那么这种思想呢,大家现在来看,呃,可能朦朦胧胧有点感觉,那具体来说呢,我们都讲到,比如说像Java或者Python去操作数据库的时候呢,我们还会再提到他。那在我们现在呢,专门讲数据库的时候呢,大家仅仅作为一个了解就可以了。好,那么刚才呢,咱们相当于提到了一个关于我们数据库当中最重要的一个对象,叫做标,这个表呢,跟咱们Java或者是Python中的一个类,它的这种对应关系我们就说清楚了。
07:04
就说清楚了,好,那么下一个呢,咱们来看一看,那么咱们数据库当中这个表跟表之间的这种关系啊,咱们怎么去刻画呢?你不是叫关系型数据库吗?刚才广提数据库中是有表的,那么表跟表之间这种关系怎么刻画呀,咱们提到了叫做ER模型。啊,注意咱们讲下篇的时候,到时候还会说哈,现在呢,有的同学可能稍微有点懵了,你得跟上我这个节奏,咱们先是做一个了解啊,先做个了解,那么这个一二模型,这个E呢叫ENT,二呢叫做relationship,主要呢体现呢,这里边有三个概念,实体集,属性和联系集,那么其实咱们刚才讲的这个,呃,这个OM这种映射关系里边的这个实体集跟属性啊,咱们刚才其实已经刻画过了。那实体集就是咱们这张表呗。那属性呢,就是这里边儿提到了,你看一个一个的这种字段。啊,一个一个的这种字段啊,那么跟我们后续呢,编程语言在一块儿结合的时候呢,对应的这种关系,那我们其实也说清楚了。
08:05
啊,那么这个大家你要放在编程语言当中呢,就会提到一个概念啊,说叫,比如说Java中我们经常提到叫万事万物皆对象,那么大家你想一想诶,怎么体现这种万事万物皆对象啊,你会发现呢,我们Java语言要是操作数据库的话呢,你是不是把数据库中,数据库当中人家主要的结构也看成是类中的对象了。哎,是不是能够对万事万物皆对象有一个更清晰的理解,对吧?好了,那么ER模型当中除了这两个之外呢,还起到一种联系,那么这个联系呢,就是来刻画咱们表中一条一条的记录,呃,跟另外的这种表,哎,一条记录之间这种关系该如何去表达?哎,就提到了表的关联关系,那我们下边来看看这个关联关系都有哪些。那么我们如何去刻画表之间的这种数据之间的关系啊,我们说这里边儿一共有四种关系啊,分别对应着叫啊,一对一的关联关系,一对多的关联关系,多对多的和自我引用。
09:08
那其实这个呢,大家也不是特别的陌生,为啥呢?因为咱们现实世界当中啊,很多数据之间是不是也存在着这样的这种对应关系啊,比如说哎,这个。世界上基本上各个国家都会提到了,叫一夫一妻制,对吧?诶基本上所有国家啊,也有一些特殊的国家,这个一夫一妻制的话呢,相当于你是不是一个,那我们说一个一个husband啊,一个丈夫是吧,就对应着一个wife,那就是一对一的这种关系。哎,那什么叫一对多的关系呢?比如说现在国家呢,也放开这个计划生育的,这个你可以生多个孩子,那一个,呃,父亲或者一个母亲,你是不是可以对应的多个子女啊,那就是相当于一对多的这种关系啊,多对多的关系呢,那也挺多的,那你比如说咱们以这种图模型当中啊,上面我们也提到了这个非关系性数据库当中这种图结构是吧?那比如说你发快递吧,呃,你在这儿你可以是不是给很多人去发快递啊,就是一对多了,但同时的话呢,很多人是不是也可以给你发快递啊?哎,这就相当于又又一个多对一的这样关系,那整体上就构成了一个多对多的这样的一个关系。
10:10
好,那还有呢,叫自我引用,就是自己引用自己,那这个在我们表当中该如何体现呢?哎,咱们展开来说,哎,首先呢,咱们来看第一个啊,叫一对一啊,One to one,这个one啊,大家就理解成是一条记录就行。哎,一个表中,一个表A当中的一条记录对应另外一个表B当中的一条记录啊,是一对一的关系。诶,大家首先呢,会看到我这里写了这样一句话啊,不知道看能不能理解说呀,在实际开发当中啊,这种场景不多啊,因为呢,一对一呃,完全可以造成一张表。诶,啥意思呢?好,大家看我们下边这个例子。比如说咱们现在呢,是一个学生表,这个学生表啊,我们一共呢,是有这么多的字段啊,学号姓名手机号等等等等等,这个很好理解对吧,那么我们这里边儿呢,呃,怎么就能体现这个一对一的,咱们把这张表啊拆成了两个表。
11:05
啊,其中一个表呢,来放我们学生的常见信息,学号,姓名,手机号,班级级别。这个来放的是这些常见的这些呃字段,那么另外一个表中来存放,哎,不常用的一些字段,我们可以叫成这个档案信息表。啊,档案信息表,那么这两张表造完之后呀,我们说这两个表当中的,呃,这个表中的一条记录跟我们另外一张表中的一条记录呢,是一对一的关系,比如说我们这个学号呢,叫1001,哎,这呢对应的比如说叫张三是吧。哎,张三呢,这是他的这个基本的信息了,然后另外一个表中,你也找这个1001这个学号其实就还是张三了,哎,后边呢,他的这个信息不可能说在我们第一张叫记录信息表里边儿,1001在我们这个表中对应的两条记录,那是不可能的。那都是一对一的这种关系。好了,那么这时候呢,就会提到说,那我们为什么造两张表啊,大家一想,是不是完全可以把这呃这个两波字段呢,合成一张表就可以了。
12:04
啊,为什么要和跟这个分开的区别呢?就是咱们呃后边呢,真正你要是查询,比如说咱们想查询某一个学号的学生的姓名,手机号,加上他的家庭住址的话呢,如果你要是用的两张表,我们就涉及到叫多表的一个查询啊色呢,对应的写起来呢,比我们在一张表中呢要复杂一些。啊,那大家就会想说呢,我们直接造成一张表不就完了吗?哎,当然呢,是可以的,但是从这个,嗯,整个数据库的一个设计上来讲,这个大家注意听,这是一个高大上的内容啊,就是设计成一张表呢,我们circleq呢,写起来会比较简洁一些,但是呢,如果我们在实际开发当中发现这张表的字段呢,非常之多啊,20个,30个,乃至于说更多,那么有一些字段呢是常用的,有些是不是常用的,那么我完全可以把它分拆到两个表当中,这呢是关于呃,这个关联到就是数据表的一个设计的一个优化上。啊,以后我们会讲在这个下篇当中,哎,再漏一眼。
13:04
咱们在讲这个下篇的时候呢,会提到了关于我们这个数据库中的设计规范啊,里边呢,是有一些规则啊,这个包括还有一些优化的点,那我们这儿就是一个优化点,就是把不常用的字段呢,咱们放到一个表当中,常用的呢,放到另外一个表当中,好处是什么呢?大家你想想我们常见这个字段,如果你要是没有拆分的话呢,每次咱们加载都得是把这一条记录啊,可能我给你举个例子,比如有30个字段,我们每次呢,其实只用里边常见的这几个字段了,那你你每次如果加载多余的这些字段呢,我们都称为呢,叫做冗余字段。那么你加载这种A字段比较多的话呢,是不是内存占用就多,那么这就导致我们有可能在查询的时候呢,就要进行的这个IO的次数呢,就会偏多,是不是相应的效率就会低呀。啊,一旦这IO次数多了,那这效率呢一定会低啊,这就是这个原因,基于这样的情况呢,我们把它拆分出两张表,就是按常用和不常用来进行拆的,所以是有实际常用的啊OK,好,那这是我们说的这个事儿,然后下边呢,涉及到这种见表这种原则啊,外键唯一,外间是主见,目前大家看的话呢,看不懂,等我们讲了上篇当中的这个约束的时候。
14:14
哎,上面咱们讲这个约束,到时候大家再去理解这个事儿就非常的清楚了,好,这个就先过了,下一个呢,叫做一对多的关系啊,One to many,哎,我们表A当中的一条记录,对应的表B当中的多条记录。啊,就构成了一对多的关系,那比如说常见的场景说叫客户表和订单表啊,一个客户是不是可以有多个订单啊,嗯,然后这个分类表和商品表啊,就是商品分类表和商品这种详情表,比如说某一个大的门类下边我们有多种商品,对吧?哎,一对多,然后部门表和员工表,一个部门当中可以有多个员工嘛,哎,就构成了一对多的关系。那比如说下边我们举的这个例子,就是员工表和部门表,那这里边这个编号呢,指的是员工编号,我们下边这编号呢,指的是部门的编号,注意这俩是不一样的,那么一个员工他会有对应的一个部门,但是反过来讲,我们一个部门当中是不是有多个员工啊,哎,那么这就是一对多的关系。
15:14
那一对多的关系,那这里边儿呢,就提到了一个叫做主表,一个叫从表,这个大家也是先了解一下啊,这个后续咱们都会展开讲解这些东西,那所谓的这个主表的话呢,就比如说我们这里边儿这个部门表。他就是主表,那这个从表的话呢,就是我们上边这个叫员工表,那我们一个部门表啊,一个部门的ID是不是就对应着我们这里边有多个员工了,哎,这不就一对多吗。哎,这样那同样的,你看还有其他的例子,说我们学生一个学生的一个学号,就是对应的一个学生,一个学生的话呢,他的成绩,那一个学生考好几门课嘛,所以他就会有好几条记录是成绩的。哎,是这样的情况,还有呢,包括我们这个,哎,这是这个课程编号的,比如说课程编号一叫计算机应用基础这一门课程编号呢,在学生这个成绩当中,你会发现呢,对应的课程编号是一的,是不是有好多同学,那因为好多同学呢,是不是都得考这门课,所以他这块涉及到成绩有比较多,所以这是一对多了。
16:13
哎,这样的没问题啊,还有呢,包括比如我们说的省份,一个省里边是不是有多个城市啊,那我们省这是一个表,城市呢,哎,是另外的一个表,那我们一个省对应的这个多个城市又是一个一对多的关系。嗯,比较清楚好,然后下边呢,叫做多对多的关系,这个呢,大家理解起来会稍微的难一点啊,我们说呢,要想表示这种多对多的关系啊,必须创建第三个表啊,这个表呢成为呢叫连接表,它呢其实对应的是有两个这个一对多的啊,就是就是连接表呢,就好比我们这里边这个叫中间表一样啊,就相当于是这这俩之间呢,是构成了一对多的关系,这俩之间构成了一对多的关系,那么整体上来看,这俩呢就是属于多对多的关系了。有点懵是吧?来我们举个例子啊,举个例子。
17:02
大家看这。比如说呢,我们这个叫呃,学生信息表啊,一条记录啊,就对应着一个学生。啊,一条记录对应个学生,那课程信息表,那一条记录呢,就对应了一个课程的信息。一个学生,这是一条记录,就是一个课程,清楚吧,好,那么选课信息表,这是第三张表,也就是我们这里边的中间表,或者叫连接表。那选课信息表当中啊,你看的话,你会发现,哎哟,一个学生啊,他可以选多门课,那一门课呢,是不是也可以被多个学生所选择呀。那么你要是此时呢,你就看这两个表的话呢,相当于是一个学生对应的可能有多个课,那么一个课的话呢,反过来也对应的有多个学生,是不是他俩之间就是多对多的关系。那这种关系呢,咱们是不是在这张表当中体现出来的。对吧,哎,体现出来的。检出来的OK啊,那这边也举了一个例子。举个例子,这个学号你看这两个学号,这都是一个人,那它对应的这个课程编号,然后或者你看这吧,这是我们说相同的一个课是不是对应的有两个人是吧,然后相同的一个人是不是对应的有两个课呀,哎,这就是多对多的关系。
18:13
好,下边的话呢,再举个例子,比如说这个产品和订单,那我们一个产品的话呢,是不是可以存储在多个订单当中,那么一个订单当中啊,是不也可以包括多个产品啊,那么他们俩的这种多对多的关系呢,体现在咱们的订单详细或者叫详情表当中。啊,详情表当中你会发现呢,就是体现一种多对多的关系,还有呢,比如说用户和角色。啊,这个咱们在讲数据库当中也会提到这种角色啊,用户呢,就是一个user,那你也可以不呃理解成咱们数据库啊,生活当中也一样,每个人是不是,呃你比如说嗯,在座的大家吧,呃,你呢是一个人,你呢是不是也有多种角色呀,比如说呢,大家现在听课啊,这个你可以理解成你的角色呢,就是学生。那有可能你现在呢,已经结婚了啊,那相较于你的这个妻子来讲,你是不是就丈夫的一个角色呀,那如果还有孩子了,那是不是就一个父亲的一个角色呀,所以一个人啊,可以有多个角色。
19:08
那同样的话呢,一个角色是不是也可有多个人啊,那当然了,那你比如说账户这个角色,那中国的全天下那账户多了是吧,那一个角色也对应的有多个账户,哎,多个这个用户,所以呢,也是多对多的一种关系啊。好,下面一种呢,叫做自我引用,就是自己引用自己,哎,这个有点意思啊,那举例子呢,也非常简单,比如说呢,我们在员工表当中,具体的这就是每一个员工,那对于这个呃,104105这两个员工来讲啊,他们都有自己的这个主管的编号,那么主管这个编号呢,你发现主管呢,那不也得是公司的一个员工吧。所以说呢,哎,104105他们对应的103啊,103也是一个员工,呃,自己对应自己,那这呢,我们称为呢,叫自我引用。好了,那么整个呢,咱们就来给大家讲解了一下,咱们所谓的叫ER模型啊,应该说是比较清楚的,但是啊,但是大家掌握的不一定好。
20:04
诶,咱们到夏天的时候,咱们还会给大家呢,去讲解咱们数据库设计规范里边,像提到这种范式啊,提到这个ER模型啊,包括我们这个这个表的一个设计规则呀,到时候我们还会去讲,现在的话呢,大家先整体上做一个了解就可以了。啊就可以了,那咱们下一章呢,开始带大家呢,来装数据库,来学习SQL。
我来说两句