00:00
好,那么刚才呢,咱们讲了一个呢,叫做反式化啊,相当于呢,就是针对于咱们讲的一范式二范式三范式的基础之上呢,我们就是不遵循他们了,当然这个反范式话呢,一般来说呢,不遵循的是第三范式和第二范式,第一范式呢,一般都是遵循的,OK行,然后的话呢,我们再来看下一个内容,叫做巴斯范式,说巴斯范式呢,相当于是在这个第三范式的基础上呢,做了一个改进,所以呢,通常呢,也称为呢叫修正的第三范式,或叫扩充的第三范式,就没有呢,把它在称为呢叫第四范式了。啊,你看我下边写了一句话说若一个关系达到了第三范式,并且呢,它只有一个候选键,或者呢,它的每一个候选键呢,都是单属性的,就是不是联合的啊,联合组建啊这种联合的形式,那么该关系呢,就自然的达到了叫巴斯范式啊,也就是说呢,它只是在我们三范式的基础上呢,做了一个呃优化而已啊,使得我们这个冗誉度呢就更小了,哎就这个意思,这个巴斯范式的话呢,这个它其实是巴斯科德范式的一个简称啊巴斯科德那其实对应的是两个人,那这里边的话呢,习惯上我们就都称为呢叫八斯范式啊,BCNF指的就是八四范式了啊,一般来说呢,我们如果要是想遵循这个范式的话呢,大家呃,通常呢,就遵循到这个三范式或者话呢,稍微优化一点的这个八四范式就可以了,后续的这个像式四范式啊,五范式啊,包括这叫遇见范式呢,这个大家其实呢,只是做一个了解就行啊,一般咱们都不用了,你像越往下的话呢,这个相当于是我们的表的设计就是越细容易度呢就越低,你查询的话呢,是不是效率就越差了,对吧。
01:30
哎,咱们达到一个平衡,到三范式,到这个八四范式就OK了。但是呢,我们讲解的时候呢,咱们把这个下边这内容呢,还是要给大家讲一下的,首先呢,我们来看一下这个八斯范是我们一个案例呢,来出发,哎,这个案例呢,也是这个,诶我找了一个网上比较经典的一个案例哈,我们就直接呢来使用了,好大家来看一下,说这个案例当中是这样来记录的啊,说北京仓张三啊,这是他管理的这个仓库的物品啊,北京仓张三,这上海仓,上海仓这里边儿呢,有个特点,就是说只要是这个北京仓呢,就始终是张三来管理,只要是这个上海仓的话呢,就诶始终是李四来管理。
02:05
啊,是这样的一个情况,相当于呢,他们两个是互相决定的关系啊,你要说是张三管理员的话呢,自然而然也就知道他是北京仓了,你要说李四的话呢,也自然而然就知道他是上海仓了。对吧,这这个情况,然后的话呢,下边这个有个物品名,这一个仓库的话呢,肯定要放很多物品了,毫无疑问对吧,那么你说我们这个物品的数量,它这由谁来决定呢?那这时候呢,就涉及到我们这个表呢,咱们该如何呢去设置它的这个啊,你叫候选键也好,叫主键也好了,对吧,那这里边会是什么情况呢。这里边儿呢,我们这个仓库名和这个物品名啊,诶我们说呢,其实就可以构成一个叫候选键了啊,你想想我们这时候的话呢,咱们先看这个叫数量吧,数量的话呢,你说是多少是不是,你得告诉我是哪一个仓库里边的哪一个物品,我就知道呢,这个数量是多少了,对吧?诶这是一个,然后另外的话呢,就是这是一组会员键,咱们还可以呢,有一组候选键,就是我们这个管理员和这个物品名,他俩呢,相当于也是一组候选。
03:00
对吧,诶他俩也是一组会员键,然后呢,这个数量呢,也同样的由这个来决定,行这呢就是我们这个概念啊,先明确一下呃,就是管理员物品名或者叫仓库名物品名啊这个构成的就是这个候选键,那你可以选一个主键,选主件的话呢,比如说咱们就选成叫仓库名和这个物品名吧,啊这个呢叫主件,那主属性的话呢,就是我们这仨是不是都是主属性。哎,主属性就是我们候选键里边涉及到的这个属性都是主属性,这仨都是,然后呢,这个数量的话呢,是不是就非主属性了,好,那么首先的话呢,我们先判别一下他们是不是满足咱们说的这个三范式的啊。是不是满足三范式,首先呢,第一范式,呃,保证这原子性这没问题吧,好,那么第二个呢,呃,范式的话呢,我们说到的就是说这个每一个这个非主属性啊,是不是它就完全依赖于我们这个,呃。叫什么候选键,或者叫这个主件了,对吧,那这里边儿呢,我们这个非主属性呢,是不是只有这个叫呃数量啊啊只有它啊,只有它的话呢,你看它是完全决定于我们仓库名和物品名嘛,肯定没问题,刚才咱们都已经说过了,说到了你说物量数量是多少,你得告诉我是不是哪个仓库里边哪个物品啊。
04:07
或者说呢,就哪个管理员哪个物品对吧,这个呢,相当于也满足我们这个二范式啊,相当于是一个完全依赖的关系,然后第三范式的话呢,我们刻画的是什么意思呢。回忆一下第三范式的话呢,相当于是我们这个非主属性之间,他们不能存在这种依赖关系,你得是独立的,那我们这个非主属性就这哥们儿一个,那那他肯定是独立的呀,所以说呢,我们目前的这个表啊,是符合三范式的。啊,第三范式是吧,一二三都OK的,那符合的情况下呢,我们说这个里边呢,就没有问题吗?哎,这个咱们为了方便的去刻画,我这么着咱把这个呢先盯一下啊。诶下边呢,我就直接呢,就这样拽的时候呢,我们能看到这个表了,说现在还有没有问题呢?诶其实呢,还是存在问题的,比如说我们增加了一个仓库,诶咱们现在呢,是不是让这个字段和这个字段供在一起,构成了我们这个主件了,对吧?我们现在增加了一个仓库,然后呢,但是这个仓库里边呢,还没有放任何的物品,那么大家你想想,如果我们要是往列表中去添加数据的话,你说靠谱吗?
05:07
不靠谱啊,因为我们会出现这个插入异常,诶这呢就涉及到我们这个联合构成的这个主件的话呢,是不允许填空值的啊,诶你增加了一个仓库,你这个值呢,就必须得填上一个,那现在又没有具体的这个物品,那他不就不让你填了嘛,你要填就报异常对吧,这是一个事儿,第二是说如果仓库呢,更换了管理员。我们就可能会出现呢,叫修改数据库中的这个多条记录。你看我们要修改这个管理员的话呢,比如我们这里边呢,北京仓的这有都叫张三,你要修改张张三是不是其他的这个好多呢,也得跟着改,你像一个仓库呢,我们可能存在要上百条这个商品,那是不是所有的都得跟着改啊,没问题是吧?说如果呢,仓库里的商品啊,都卖空了啊,这个所有的商品呢都卖空了,那这时候呢,你要是空的话呢,这个你写个尿值,逐渐说了,不能是有尿值,是不是对应的那个仓库也得给删掉啊。啊,你看这里边儿这个问题还是挺多的啊,那所以说呢,我们在这个第三范式的基础之上呢,我们还得考虑呢,呃,再进一步的去解决这个问题。
06:07
啊。好,那这里边儿我们去分析一下,造成这个异常啊,这个我们说不满意的这种情况呢,出现的原因是什么?这个主属性仓库名是不是就我们这仓库名它呢,对于我们这个候选键,候选键呢,咱叫管理员物品名是不是这俩好你这个主属性啊,仓库名对于我们这个候选键,这里边是一个部分依赖的关系,诶部分依赖关系什么意思啊,你看咱们这个仓库名啊,咱说了是不是他跟这个管理员呢,他俩是你决定我,我决定你。是一匹配的对吧,那我们这儿呢,是一组候选键,你这个呢,是主键中的一个属性,这个主键的这个属中的这个属性呢,你依赖于我们这个候选键中的这个,诶,或者叫依赖我们这个候选键当中的部分的这个,呃,这个这个属性。啊,相当于是构成那个部分依赖的关系了,那这样的话呢,我们就说哎不行啊,那如果不存在这种部分依赖的关系呢,那我们就说呢,哎,它就是一个哎满足叫八四反式的。
07:03
来满足八次反射的行,这块呢,大家可能听着稍微有点懵是吧,诶咱们现在呢,首先说呢,你是存在着这个针对候选键中这个张三这个部分的一个依赖关系的,那这是我们就要去给他改造了,因为你不满足巴斯范式的嘛,怎么改造呢?诶你就把这里边儿是不是你俩这种发生这种叫部分的依赖关系,那就把你俩取出来。啊,所以说这是我们就先取了一个叫仓库表啊,仓库名管理员啊,仓库名管理员,诶把它俩取出来,然后呢,你这个库存表呢,就是专门来放你刚才之外的那个主键的,咱们刚才说的主键呢,是不是叫诶仓库名物品名和这个数量是吧?诶这样就可以了,诶这个时候呢,是不是仍然满足我们说的这个叫诶三范式是吧?诶这个呢,在这个基础上还满足了我们的叫八四凡式。哎,这就可以了,哎,就能避免刚才我们说的这样几个问题啊,OK,行,然后呢,哎,方便大家理解,咱们再举一个例子啊,哎,再举一个例子。我把这个图呢也截一下吧。啊,因为越往下的话呢,大家理解起来呢,可能稍微说呢,难度呢就会越大一些是吧?哎,我们为了方便呢,大家呢,就是诶对比一下啊。
08:08
好,我们来看这个表哈,这个表里边呢,我们叫学生和导师的表啊,有这样的几个字段啊,学生的ID major啊,Adviser和这个,呃,这个GPA好,那这里边的话呢,我们先看一看啊,这个学生的ID的话呢,它在整个表中呢,它不是唯一的啊,因为呢这个,呃,比如人工智能这个专业的这个ID呢,是从一开始的,大数据里边呢,他也是从这个一开始的,那是这样子的,行,然后呢,这里就是对应的这个专业的这个导师好,然后我们设置主件应该是用哪个呢?哎,不妨呢,比如我们就设置成这个了,因为你光考虑ID呢还不行,还得考虑上这个专业,对吧?好,这我说呢,这构成一个主见就靠谱了。哎,就靠谱了,然后呢,你这个学生是这个专业的啊,一号的这个学生他的导师是谁,他的这个GPA是多少是吧?哎,这就没问题了,相当于这个啊student和major呢,联合在一起,构成了我们一个联合主件。然后在这个里边啊,其实就有点类似于我们刚才那是不是这个字段,哎,这个字段和我们这个字段是吧,才合在一起构成一个主键一样啊。
09:07
然后呢,在我们这个表里边呢,也有一个啊,我们这呢叫管理员了啊,是一个候选建中的一个属性了,哎,我们这里边也有个谁啊叫做weather啊,这个weather呢,叫做这个导师,这个导师的话呢,你看看啊,呃,一般呢,我们说一个导师他是哪个专业方向的,是不是就是确定的呀。对吧,哎,他就是这个确定的哈,呃,那么这个时候的话呢,我们说这个导师跟这个学生这个ID这哥俩的话呢,是不是也能够构成是一个,呃,我们叫候选键吧。大家你看对吗?对吧?啊,你比如我们这个一号这个学生,他导师只要是他的,其实相当于你也就确定这个专业了啊,因为导师呢是哪个专业的,然后你相当于呢,你这个学生这不跟着也就确定起来了嘛,所以说呢,我们这两呢合在一起构成一个候选键,然后这个呢,这两个呢,是我们真正现在要用的这个主键。好,主键里边的一个属性,是不是说呢,被我们这个叫adviser这样的一个候选键的一个属性所决定了。
10:05
我们说是一个导师,这个一确定了,是不是这个专业就确定了。你看跟我们这是不是一样,哎,我们主键当中的一个属性是不是被我们这个候选键中的这个属性的所决定了。对吧,哎,有这种或者叫依赖关系吧,哎,你看这时候呢,他就不行了。哎,所以说呢,我们这个呢,目前他也不遵循这个叫巴斯范式,好,那你不遵循巴斯范式要改,呃,我们刚才说到了是谁呀,是你这个是不是受他这个影响啊,那干脆呢,受影响就把你这哥俩拿出来,所以呢,我们就建了一个叫导师表啊,一个呢是这个导师的名,一个是导师的这个专业啊major,然后这个里边的话呢,我们是student ID和我们这个叫。嗯,这俩是吧,哎,我们用这俩呢,相当于是合并在一起的。啊这样的一个方向,或者呢,你这块呢,用这个major是不是也行啊也可以的啊好,这个呢,就是我们说的这个叫嗯八四范式啊好,那么接下来的话呢,我们说一下叫第四范式啊第四范式要说清楚呢,首先我们得理解一个概念,叫做多值依赖啊什么叫多值依赖呢?诶多值依赖呢,及属性之间的一对多的关系啊我们说呢,呃,一个K值它可以多决定了多个A的值啊就是这样的一对多的关系,那么对应的话呢,就属于这个单值依赖啊单质依量就是一对一的关系,那我们这个函数依赖呢,其实呢,其实呢,它是属于叫啊单质依赖的啊,因为我们一个自变量进去之后啊,经过一个函数出来一个因变量啊,一个对一个是吧,哎,这样的情况,所以说呢,我们这个函数依赖呢,它不属于这种一对多的关系啊。
11:36
诶,然后接下来的话呢,针对这个多指依赖呢,我们提到了两个概念啊,或者呢,它又分成了叫做平反的多指依赖和非平反的多指依赖。那什么叫平凡都是依赖呢?就是我们这个全集啊,就是你这个表中的这个字段,它等于K加A。这个一个K呢,可以对应着多个A啊,就是这样的一个情况,我们整个这个表里边呢,就只有这一组一对多的关系啊,注意就这一组,那什么叫非平繁的多值关系,多值依赖呢,就是我们这个全集U呢,等于K加A加B啊,那我们这个时候呢,一个K啊对应着多个A,一个K呢对应着多个B。
12:12
啊,相当于我们是不是有多组这个一对多的关系啊,而且这里边儿呢,多组的这个A和这个B呢,这个他们之间呢,还是相互独立的。啊相互独立的,而且呢,我们这时候多组的一对多呢,这个一呢,还都得是同一个一,也就是说呢,你像我们这里边儿K呢,对应的多个AK呢,对应多个B,这两个K呢得是一样的,你不能是K1对应的多个AK,二对应的多个B,那不行。啊,注意啊,这叫非平凡的多值依赖啊,这个有点绕是吧?啊有点绕啊,啊这个,而且呢,说A跟B呢,还得相互独立,咱们下边有这个例子啊,我一说呢,大家就能明白了。好,呃,那么呢,我们说这个第四范式啊,它是在满足这个巴斯范式的基础之上呢,消除了谁呀?诶把这个非频繁的多值依赖干掉,把这个函数依赖干掉,然后呢,只保留叫频繁的多值依赖啊,那此时呢,它就是满足这个第四范式的。
13:04
好,那么这时候呢,我们来看这个具体的例子啊,比如大家看这呢,我们一个表呢,叫职工表,这个职工表当中呢,有这样的几个字段,叫职工的编号,职工孩子的姓名和职工的选修的课程。哎,大家你看我们这个表呢,哎,是不是一个叫哎多个一对多的关系啊。啊,或者我们按照上面的名来叫呢,就是非平凡的多值依赖啊,大家能理解吗?你看这个主件的话,其实就它了,对吧,我们这个职工的编号的话呢,说他呢一个职工啊,他的一个编号,他呢有能有多个孩子,是不是一对多的关系啊,而且呢,一个职工编号啊,他是不是就有可能会选修多个课程啊。啊,你看这样的话呢,我们是不是就存在着,就类似于我们这呢,哎,一个K是不是决定多个A,一个K呢,决定多个B啊哎,它就属于这个非平繁的多这一带,那不行。那不行,那不满足我们这个第一次范式,我们就可以把它呢,是不是再改造成是一个,诶满足第一次范式的怎么办呢?那就把这个,呃,K决定AK决定把这俩拆成两个表就完了。
14:05
啊,拆完以后的话呢,我们就相当于是一个呢,叫职工表一啊,职工的编号和职工的孩子姓名啊,职工表二啊,职工的编号和职工的选修课程。大哎,就这样个场景,这个呢,就是满足我们说这个第四范式了。啊,满足第四范式了,好,这呢是我们举的一个例子啊,咱们再给大家举个例子,比如我们这里边呢,一个表中涉及到有三个字段,叫做这个课程的ID啊,教师的ID,还有这个教材的ID。啊,我们这一个课程的话呢,可能会对应多个老师来讲啊,一个课程的话呢,它也可能呢,用多种不同的教材,诶你看这里边儿是不是又是出现这一对多一对多是不是这样的这个关系了。啊没问题,好,那为了这个表达方便的话呢,我们把这ID呢,就改成是具体的这个内了啊那那这呢,就我们具体课程啊,英语啊,还是高数啊,然后这呢具体的一个老师啊,这呢是用的具体的这个教材啊,英语这个课啊,这个老师讲,他用的是这个教材啊,还是英语这个课还是这个老师讲,但是呢,他又换了教材了。
15:01
是吧,就成这样情况,那问大家,我们这个表里边儿的主见,你看是谁呀?哎,逐渐你看要首先courses不靠谱对吧,还有相同的值了,那这个cos加上我们的teacher。啊,那英语B儿比尔是吧,然后呢,它用的这个不一样,英语比儿这一样了,那不行,所以说我们这个表里边的这个主见是谁呀,就是这三个字段呢,合在一起构成了一个主键啊,也就是说我们这个表什么只有主键啊,没有其他这个非主键的这个属性了。啊,那既然他们都是主见了,那我问大家,你说我们这个呢,满足这个三范式吗。毫无疑问啊对吧,首先呢,呃,第一范是原子性满足了,呃第二范式的话呢,说诶我们这个非主键的这个其他的这个属性哈,呃,是不是完全依赖都没有这个其他的属性了。对吧,那你这个就无从谈起,这个这个这个这个是不是完全依赖了啊。另外的话呢,你这个非主属性呢,是不是存在这种,那他们之间的依赖关系,这都没有这个非主属性了,所以呢,1233个范式呢,就很轻松的就满足了,嗯,那么仍然是我们说的这个场景啊,你现在的话呢,呃,是一个对应多个,一个对应多个,那我们还是要给他去做一个拆分,诶拆分以后的话呢,我们就会,呃,就是拆成两个一对多的啊,Course对应的teacher,对应的这个book啊,这样呢就满足这个词范式了。
16:19
行哎,虽然说我们这块呢,进行了拆分哈,但是实际当中啊,我们说这个四范式其实用的就已经很少了。啊,就已经用的很少了啊,因为呢,它会导致我们呃进行相关的查询的时候呢,效率就更低了啊OK,呃,下边的话呢,我们再看一看这个第五范式和约预见的一个范式,除了除了第四范式之外呢,还有更高级的叫第五范式,又称为呢叫完美范式啊都已经完美了是吧。那么在这个示范式的基础之上呢?消除不是由候选键所蕴含的连接依赖。啊,这个具体来讲呢,说如果关系模式二当中的每一个连接依赖呢,军事由二的这个候选界呢,所隐含的啊,这时候我们就称为呢是满足第五范式的啊,那么这呢,提到一个叫连接依赖的问题啊,我们说这函数依赖呢,就属于叫多值依赖的一种特殊情况,而这个多值依赖呢,就属于这个连接依赖的一种特殊情况啊,因为呢,像函数依赖和多数依赖呢,它属于这个语义呢,是直接导出的,而我们这个连接依赖呢,属于这个呃。
17:13
叫关系连接运算才能够反映出来的啊,那么存在这个连接依赖的话呢,这种关系模式呢,还可能会遇到相关的这种异常问题啊,了解下就行,然后第五范式的话呢,它是无损的连接啊,它处理的是这个无损的连接问题,这个范式呢,呃,其实也没有实际的意义了啊,大家做一个了解就可以了啊,讲这么多的话呢,越往后这块呢,大家你听一听就行啊,整多了你反而这就整懵了啊,三范式加上这个八次范式啊,这个呢我们已经足够了啊,反而呢,你再关注一下就是反范式啊,这个呢,倒是很多情况下呢,需要大家呢去掌握的。而这个叫遇见范式的话呢,哎,它属于一个,呃,要解决的一个叫终极范身问题,属于理论上的一个研究啊,这个大家就不要去关注了,你像这个呃,一定得有理论上一个研究的,对吧?你要不这个很多大学里边这个科研,嗯,他一定是在实际当中更具备一个前瞻性的啊,这是其一,其二的话呢,你得花这个经费啊是吧,你得给他们有点空间再去研究一点别的东西啊,你要不能研究的话呢,这经费不是没得花了吗?是吧?好,这个呢,就是我们说的这个第四范式,第五范式和这个诶预见范式啊,整体来讲大家做一个了解就OK了。
我来说两句