00:00
接下来咱们要说这个三番式了啊。三分式首先咱们来看一看啊,为什么要数据的规范化?数据的规范化。他如果不合规范的数据啊,不和这个表的设计啊。信息重复。哎,插入异常,删除异常,这些都是不规范的设计会导致的问题啊,会导致的一些问题,所以呢,咱们一定要规范化。使用三范式,三大范式来设计数据库,首先看第一板斧,也就是说第一范式,第一范式这个东西啊,强调一下啊,我为什么把这个东西写在这儿。因为有的什么那个笔试题中啊,它就会以这种方式出现。说这个是第一范式的意思,你应该知道啊,这叫第一范式好吧。多看两眼,有个印象就好啊。那第一范式是干嘛的呢?他说了,它是确保每列的原子性。
01:05
每列都是不可再分的最小数据单元。则满足第一范式。到底啥意思呢?再把这个图你再看一遍。首先原来的表我设计成这个样子。然后根据第一范式,我将原来的表设计成这个样子。那他俩到底有什么区别?你就知道第一范式是干啥的了。看到了吗?原来的地址啊,叫中国北京,美国纽约。那么国家和城市之间是不是可以再切开呀?可以切开啊,所以我就把这个列,这个列切成了两个列。切成了两类,然后你再看,那么这个country,这个国家,这个东西还能不能切开了。
02:02
切开切开出事了哈。城市能不能切开了?是不是也不能分割了?这样的话,满足了第一范式,OK。这回你再把下边这个文字再读一遍。每列都是看这个。不可以再分的最小数据单元。明白了吧,这就是第一范式。第一范式。好吧。好,第一范式不难,第二范式更简单。第二,范式更简单。这写着呢。要求每个表只描述一件事情。你看啊,这边你先甭看,你就看这边儿,原来啊,我按这个,我也不知道第二翻身是什么东西,我就设计出这么一张表来。设计出这么一张表来,那这张表里都有什么列,大家都搂一眼啊,就这些玩意儿。
03:00
就这些东西,那你看啊,那么整个这张表里到底都描述了什么东西。都描述了什么呀?是不是有客人的信息呀?客人的什么编号姓名啊,而且还有客房的信息啊。所以这一张表里边描述了几件事啊。客人和客房是不是两件事儿啊?所以这样的设计不满足第一范式。不不,第二范式啊。哎,如果想要满足第二范式,那么我就需要把这张表拆成这个样子。客人就是客人的。客房就是客房的。OK,把一张表拆成了两张表,而这一张表里边儿描述的就是客人,相关的东西都放在这张表里。那么客房相关的东西都放在客房的表里。这才是咱们第二范式的意义所在。就是叫。
04:01
一张表,一个事儿。一张表,一个事儿,OK。哎,一张表一个事儿,其实这个呀,跟咱们之前这个设计的数据库里边也同理啊,比如说咱们的这个。这这个这个你看这个表。这张表里放的是啥呀?是不是就是年级的名称啊?对吧?哎,年级的名称,那么这个年级里边都学什么课程?不会放在这里边吗?不会,而我采用了另外一张表来专门存放课程吧。OK,这就是叫年级表就是年级表,课程表就是课程表,每个表都表述一件事情,则满足第二范式。OK,第二范式听懂了吧?好,咱们来看第三范式,第三范式呢,其实并不好理解。前两个很好理解啊,咱们再简单回顾一下第一番是做啥来着。
05:01
每列不能再分了是吧,第二番式呢。一个表一个事儿,哎,OK,这两个好很好记是吧,第三个是咱们先读一遍哈。如果一个关系满足第二范式。满足第二范式,你后边先甭读。那也就是说你后边这个字你先甭读它啊。则满足第三范式啥意思呢?就是说你这个表如果不满足第二范式,它能谈得上满足第三范式吗?不能,所以这是一个什么呀,是不是叫递进的关系啊。想满足第三范式,前提是满足第二范式。明白了吧,OK,然后你再看这句话,第三范式说了个啥?这句话读一般,一般读一遍读不明白。除了主以外的其他列都不传递依赖于主键列。哎,就是就是不明白啊,你放心,我给你解释解释啊,慢慢来。
06:03
好,大家来看啊,大家来看,现在呢,房间表在这儿呢。房间表在这儿呢?那么。他肯定不满足三范式嘛,第三范式啊,那么我要经过这是经过第三范式,然后我把这张表设计成这个样子,这个样子这个样子。就把它拆成这三张表了,这个不是数量的事儿啊,是内容的事儿。你看啊,它这里边儿房间类型,房间类型这里边儿我单独给它拎出来了。比如说房间类型编号0002002。标准间床位两人价格168。168这个房间类型,房间类型刚才咱们在哪显示了,你看这里边儿的数据啊钱。什么来着?这个还有啥,这个是不是这个房间类型表里的这三列吧。那你看啊,那么这三列和你入住人数。
07:04
有没有关系?就是这个这个你别看这边了,看这个吧。这个房间我知道002号,它是一个标间,里边有两张床,一百六十八一晚上。和我入住几个人有没有关系?我就有钱,我就自己一个人,我就想住八张床行不行?没毛病啊,对吧,和你几张床,你和我几个人住有关系吗?没关系吧?哎,但是他你看他是不是全堆到一张表里了。所以它就不满足第三范式,能理解什么意思吗?哎,他们之间必须有直接的关系,你不能间接相关,就是直系亲属,你不能说七大姑八大姨。啊,七大姑八大姨也算直系亲属是吧。算不算亲估?是吧,好,大家来看啊,这个就是这个意思啊,这个就是这个意思啊,如果没明白的话,你看我再给大家来一个真实的案例,帮大家理解好吧。
08:01
先这个先暂时先过去啊,咱们直接来一个案例。假设咱们公司建筑公司要设计一个数据库,哎,公司的概括呢如下。公司承担多个工程项目,每一个工程都有工程号、工程名称、施工人员。然后公司有多个员工,每一个员工啊,职工号姓名性别职务。啊,职务就是我是工程师还是技术员,还是搬砖的是吧。最后一个呢,公司会按照工时和小时工资率来支付工资。啥意思嘞,小时工资率是吧,就说你一个小时挣多少钱,比如说我一个小时挣800。然后你干了多少个小时呢?我干了十个小时,是不是你的工资就是他俩一成啊。OK,然后小时工作率是个什么鬼呢?它是由职工的职务决定的。啥意思嘞?工程师,一个小时800。技术员,一个小时600。
09:02
搬砖的一个小时200。对吧,这个钱啊,你每个小时挣多少钱。是不是就是你职务直接关系啊,哎,植物规定的,好了,大概了解之后,咱们看图说话。这是咱们公司。这个这个这个财务啊,制作的财务报表。但是这张财务报表很明显它是不满足咱们程序员的数据库设计的啊。你看这里边儿描述的其实还是挺清晰的,咱们公司盖了一个花园大厦,他们仨盖的,这仨哥们分别这个职务。他们每个小时挣这些钱,干了这么多个小时,最后支付他们这么多钱。其实还是很清晰的是吧。很清晰啊,哎,然后盖了一个立交桥,俩哥们完成的。临江饭店这俩哥们完成的。OK,这个公咱们公司的这些业务了解了吧,那咱们就对这个表。
10:02
开始使用,现在这不是一张表吗?我要把这一张表。通过三范式来设计一下。首先咱们来观察一下它满不满足第一范式,这样的话呢,咱们其实这个结果啊,它已经满足了第一范式是吧?啊,它不需要再分割了。但是他满不满足第二范式啊。他绝对绝对绝对不满足第二范式,因为这里边儿。他描述了很多事儿啊。首先,工程相关。人员相关。钱相关。是不是三件事儿了?哎,三件事了啊,所以他肯定不满足第二范式嘛,那么咱们使用。分析一下吧。哎,这样这样。还有一个啥。咱们这样,我就不看这个图了啊,咱们这一张表里描述了很多事儿哈,我就经过了第二范式啊,把它分割成这个样子。
11:01
来看一眼。看一下。工程表就是咱们,我看到这张表,我就知道咱们公司干了多少活,接过多少项目,是这意思吧。然后第二个员工表,我看到这张表,我就知道公司有多少个员工,每个员工的姓名啦,这个职务都是什么,没问题吧。好,第三个我看到这张表,临时工时表啊,不是不是不是原项目工时表,我就知道咱们公司。这个项目花了多少钱?是不是这个意思啊?好,经过第二范式,咱们把整个这张表啊,分割成了三张表。这三张表就是一个表,一个事儿,一个事儿,一个事儿。能看清。好,那咱们第,哎第二范式搞定了之后啊,来看一看这一块问你了。他满不满足第三范式?满不满足第三范式呢?
12:00
他既然已经问到这儿了,肯定不满足是吧?哎,不满足,来,我告诉大家,为什么他不满足啊。你只要知道他为什么不满足第三范式,你是不是就知道第三范式说的是什么事了?来看着啊。哎,这么这么看吧。看这啊。嗯,打个比方。别看这了,这个这这个前面这个数据吧,这个吧。刚才他是不是把这个东西问你是否满足三啊。对吧。啥意思呢,看好了。我这个工程师。我这个工程师,或者换句话说,我是一名工程师,和你叫什么名有关系吗?肯定没关系啊。哎,跟姓名是没关系的啊。工程师,那你这样看。技术员。和你职工号有没有关系?职工号是咋来的?是根据你入职时间往后排的。
13:04
对吧。职务和姓名是无关的。OK。再看你每个小时挣多少钱,跟你叫啥有没有关系。也没关系吧,是不是也没关系。并不是说你叫齐光明,你必须65块钱小时。对吧,OK,那你再这么看,那我每个小时挣60块钱,和我的职务有没有关系。哎,这就有关系了。就这意思,你只要是律师,我不管你缺胳膊少腿还是叫什么。不管你是哪儿人,你就是60块钱小时,OK。只要你是工人,就是55块钱一小时。所以能明白啥意思了吗?再回来看。植物和小时工资率,它俩之间是不是铁打的关系啊?
14:04
而你的职务和你的姓名。有直接关系吗?不存在的,小时工资率,一小时挣多钱和你交什么有关系吗?不存在的,所以他不满足第三范式。能理解什么是第三范式了吗?那如果按照第三范式来划分的话,那整个咱们的系统表就变成了这样。一设计成为了四张表。成为了四张表。工程表、员工表、职务表和工时表。这个是咱们应用三范式的结果。应用三范式的结果。好,咱们用文字把3万式描述一遍。第一范式。第一范式。第二范式。
15:02
第三范式。好,一个个来说,这一番是说的什么来着?每列不可再分割。第二范式是一个表。一件事。对吧,第三个是说的是。列字段就是列啊,要和主见有直接。直接。的关系不能间接。相关。这就是三反式。和主键有直接的关系,不能间接相关。哎,不能间接相关。看了这三番式之后啊,咱们来看一下这个需求。哎,这儿呢,这儿呢。
16:01
咱们可以根据这三番式看看能不能把这个设计一下,这是咱们的一个数据库的设计,为了激励优秀员工为企业做出的贡献是吧,企业定期安排员工晋级。假设每个部门涉及多个岗位,每个岗位可以安排多个员工。每一个员工隶属于企业的一个部门。有一个对应的岗位。企业呢?要保留每位员工的每次晋级记录。那这样的一个需求,咱们应该应用三范式。设计出多少张表呢?
我来说两句