00:00
好,接下来我们就可以学习三范式这个具体的规则了啊,我们先看第一范式啊。好,第一范式的核心原则是属性不可切割啊,那这里边的属性指的是什么啊?指的就是呃,一张表当中的字段啊,一个字段我们就称之为一个属性啊,那属性不可切割那又是什么意思呢?往下看。好,大家来看,那这块有一个表格,这个表格是一个比较简单,比较简陋的订单表啊,那这里边儿有哪些字段,简单看一下,那有用户ID,那有商品,那有这个订单ID,还有这个商品所在的商家的ID啊,那这张表当中有没有不符合第一范式的字段呢?那显然是有的,那哪个字段其实就是商品字段,大家可以看到啊,这个商品字段当中包含了两部分内容,那一部分呢,是我们所购买的商品的件数,那还有一个呢,就是我们所购买的商品。OK,那显然这个商品字段是可以切割的,也就是它是不满足第一范式要求的啊,OK,那我们如果说要想让张表符合第一范式,应该怎么去修改这张表呢?那显然就是将呃,商品这个字段拆成两个,那也就是下边啊这样。
01:17
对吧?我们将商品字段分别拆到了诶,数量和商品这两个字当中,那这就是符合或叫做满足第一范式的表格设计啊,那第一范式呢,实际上是我们所有关系型数据库当中的最基本的要求啊,如果第一范式都不满足,那后续的范式啊,也就没必要去谈了。第一范式我们就讲完了啊好,那接下来我们看第二范式。第二范式的核心原则是不能存在部分函数依赖啊,那实际上这句话说的不是特别完整啊,那说完整之后应该是不能存在非主键字段部分函数依赖于主键字段的现象。
02:00
啊,OK,那这其实才是第二范式核心原则啊,OK,那接下来我们通过一个呃小例子来看一下这个第二范式,大家来看一下这张表啊,这就是我们刚刚所看到的那个成绩单啊,它里边存储了每个学生每门课程的成绩,OK,那现在我们打眼一看应该就能发现啊,那这张表它里边的数据是存在冗余现象的。啊,这是能看到的,对吧?你看这些数据是不是都重复存储了呀,对吧?那既然它存在这个冗余现象,那就说明它是不满足三范式的要求的,没错吧?那现在我们要学习的是第二范式啊,那所以说我们现在先来找一找,那这张表当中是否有不满足第二范式的现象啊,也就是说去找一找,那这张表当中是否存在部分函数依赖,对吧?那我去找一下啊,那刚才提到了啊。这个这个呃,我们第二发射的原则是什么?是不能存在非主键字段,部分函数依赖于主键字段的现象,对吧?那所以说我们需要先把这个呃主键找出来啊,那主键是谁呢。
03:08
那很显然应该是由学号和课名组成的一个联合主键,对吧?啊,这是咱们这张表的主键啊,OK,那现在我们就来看一看其他字段是否哎,是部分函数依赖于主键的,来先看姓名。那姓名是不是部分函数依赖于主键的呢?那很显然是对吧,因为我要想得到姓名,只需要啊知道学号就够了对吧?啊,给我学号我就能推出姓名,那同理啊,给我学号也能推出系名,哎,给我学号也能推出系主任,没错吧?啊,那也就是说这三个字段实际上就是哎,部分函数依赖于哎这个主见的啊,那OK,那接下来看最后一个字段学呃,分数,那分数它显然是完全函数依赖于学号加科名的。啊,OK,那咱们就把这张表呃,它里边的这个部分函数依赖找到了啊,那找到之后我们应该想办法去去掉这个部分函数依赖,对吧,那如何去掉呢?
04:04
那很简单,那咱们能想到的应该就是拆表对吧?把表拆开,那具体怎么拆呢?来看一下。来,我们把上面的一张表拆成下面这两张表啊,来大家看一下,那左边这张表呢,我们只剩下学号加课名啊,还有分数,那分数啊,完全函数依赖于我们的学号加课名啊,这个没有啊,这个部分函数依赖,那右边呢,那同样呢,也不再存在这个部分函数依赖的现象了啊,是这样的啊,那我们消除部分函数依赖现象的同时,你注意观察啊,那这个数据的冗余是不是也消除了?没错吧,那原来重复存储的数据,现在诶只需要再存一份就够了啊。OK啊,那这就是我们第二范式的核心原则啊,就介绍完毕了啊,那细心的同学应该能够发现啊,呃,这一张表当中仍然存在数据冗余的现象,哪部分呢?其实是这。
05:01
你看啊,这是不是两条相同的数据啊,我们又重复存储了呀,对吧,这也是啊,这个冗余现象啊,那当然这个冗余现象呢,那它就不是呃,有部分函数依赖导致的了,因为我们已经消除掉了部分函数依赖了,对吧?啊,那也就是说这个就不是我们第二份式能管的事儿了啊那那这肯定是什么呢?肯定是不满足第三范制所导致的数据冗余,对吧?啊,所以说我们接下来去看一下这个第三范式来往下。来打开,呃,那第三算式的核心原则呢,是不能存在传递函数依赖,那当然说完整之后应该是不能存在非主键字段啊,这个传递函数依赖于主键字段的现象啊,OK,那接下来我们看一个具体的例子。啊,大家来看一下啊,那这就是我们刚刚所看到的那张拆过之后的表对吧?那刚才也分析了,这张表当中实际上是有这个数据的冗余的啊OK,那接下来我们就来看一看,那这个数据的冗余是不是由传递函数依赖所导致的呢?来咱们分析一下啊,那怎么去分析呢?
06:11
啊,我们首先得先去找一找啊,就是这张表当中是否存在传递函数依赖,那这里边儿存在不存在呢。啊,显然是存在的啊,那怎么去找这个传递函数依赖,那它找起来相对要麻烦一些啊,我们要想去找到传递函数依赖,那我们首先就得先把这张表当中所有的函数依赖关系找到啊,那咱们主干去找啊,首先我们先以主键作为哎自变量啊,然后看一看它,呃,跟其他字段的关系是什么样的?呃,这个函数依赖关系来一个个看啊,呃,我们先看一下学号,它能不能推出姓名呢?啊,是可以的,对吧?这个是呃一个函数依赖关系啊,那学号能不能推出系名呢?那肯定也是可以的,那系主任也是没有任何问题的。啊,OK,那这是我们现在已经找到的三个函数依赖关系,那接下来我们再继续往下找,那现在我们以姓名作为自变量啊,然后看一看,呃,以它作为自变量有哪些函数依赖关系?那首先我们来分析一下姓名能不能推出学号呢?
07:15
那显然是不可以的啊,为什么啊,因为我们这个函数是有一个呃前提的,什么叫函数啊啊就是一个X,也就是一个自变量只能对应于一个Y,也就是一个因变量,对吧?啊,你像咱们这这个姓名,假如说姓名我是有重名的,那是不是假如说有两个叫李晓明的,那是不是李小明我会对应两个学号啊对吧?那这样一来是不是就不不满足我们这个函数的要求了,对吧?因为我一个X对应两个Y了嘛,啊对吧?那所以说那姓名是不能作为自变量的。那同样道理,那我们来看下边啊,那我们用姓名去推戏名,是不是也有可能存在重名的问题啊,那姓名推系主任是不是也有哎相同的问题啊,所以说那这我们直接pass,那接下来下一个我们看一看戏名能不能作为自变量。
08:04
那那给给我一个系名,我能不能推出来学号呢?可不可以,这个显然是不可以对吧,因为我一个系里边是不是有很多学生啊啊,那是不是又是一个X对应多个Y,这也不行,那姓名能不能推出来姓名呢?啊,这个是这个也不行对吧,也是不行的啊,因为一个系名下边有多个学生嘛,也不行,那系名能不能推出来系主任呢。哎,这个其实是可以的啊,这个是可以的啊,就是一个系我是不是能够唯一确定一个系主任呀?啊,这是还是依赖关系啊,那OK,我们继续往下看,那系主任那能不能作为我们的自变量,那显然是不可以的,系主任他也是人对吧?是人就有可能有重名的问题啊,那所以说这个是不能作为自变量的,那所以说我们就已经把整张表当中所有的函数依赖关系找到了,那这里边有没有传递函数依赖呢?很明显是有的,对吧?学号到系名,系名到系主任。啊,是这样的啊,那所以说我们现在就得想办法消除这个传递函数依赖,那怎么消除呢?那很显然是不是还是拆表啊,对吧?啊,具体怎么拆往下看。
09:08
啊,咱们可以这样去拆这张表,那拆完之后,那首先我们来看一看这里边还有没有传递函数依赖啊,那刚才说了,那学号依赖,于是不是学号可以推出来系名,系名可以推出系主任,这是一个传递还是依赖,对吧?那现在我是不是把这个传递关系给它斩断了呀,对吧?那学号到系名,系名到系主任,那分到两张表当中就不再存在这种传递函数依赖关系了啊,那与此同时我们能够发现啊,那这部分的冗余是不是也消除了?对吧,也消除了啊,那这个呢,就是我们第三范式的核心原则,到这儿呢,就介绍完毕了啊。
我来说两句