00:00
好,接下来呢,我们看一下第九章,第九章呢是讲这个订单拉链表,那这个拉链表啊,对于我们同学来说非常非常重要,无论是开发还是面试啊,最近呢,呃,这段时间市场上啊,问这个拉链表的和做拉链表都很多,那么来看一看这个拉链表它到底为何物啊。嗯,首先第一个知道一什么是拉链表。好,来看一下拉链表,这内的拉链表呢,是记录每条信息的生命周期。啊,也就是从开始到结束,一旦一条进入到生命结束啊,生命周期结束,那就会重新开始一条新的记录啊,这很正常,并把当前日期放入生效,开始日期也是在新的一条里面,它的起始日期就是今天,那什么意思,比如说这这是一条订单。啊,或者说一条记录信息,那这条信息它的状态呢,表示的是未支付,那这个未支付它持续的时间是1月1号到1月1号一天,那到了第二天它的状态就发生了比改变,那也就是这一号,一旦一条肌肉的生命期周期结束,那他就会开始一条新的记录,比如说刚才这个未支付结束了,那他就会来到已支付,那来到已支付他就要把当前日期啊,放入到生效的开始日期,就当年日期,比如说1月2号,那就放在这儿。
01:33
啊,是这么个意思。一条记录结束,产生另一条,那么这是未支付持续了一天,已支付持续了一天,到了这个未发货这块,从1月3号一直到12月11号都持续的一个状态。然后已完成12月12号一直至今。啊,这表示至今啊,一个极大值,当然你可以用其他的,只要达不到这个日期就OK啊,用一个特殊符号表示,比如说均均就有啊,12月12号那也行,或者是12月1号啊类似的啊这种。
02:09
都可以。那你看一下,初步看一下,这就是一个类似于订单拉力表,那这个拉力表有什么好处呢?啊,我们来看下一张决定。好,那带着这个拉链表有什么好处啊,我们先看下面这个拉链表,适合于会发生变化,但是大部分是不变化的这种状态,比如说这个订单状态,它会发生变化,但是发生的变化呢,就这么几个状态,比如说未支付,已支付,未发货已完成啊状态不多。好,那订单信息从未支付、已支付、未发货、已完成等状态,比如说经历了一周,大部分时间都是不变化的。
03:01
但是呢,如果数据量有一定的规模,他就无法按照每日全量的方式去保存了啊,为什么这么说?比如说这个商城有1亿的用户。那你要想维持每天都更新它一套状态,那需要365天啊,每天都有一份用户信息,相当于你看下面这张图,这是一个完整的一号订单,那这个订单从1月1号开始生成。然后1月2号已支付,1月3号未发货,1月4号没发货,一直到2019年12月11号,说11号的时候发货了啊,然后十二一月12号变成完成那这么多状态。对于我们来说,我们只关心的是状态的变化。也说我们希望得到这种状态。什么状态呢?他未支付的状态就是1月1号啊,从开始到结束,已支付的状态,1月2号这一天未发货,就可以用这种方式表示1月3号到12月11号已完成,12月12号至今,那我只需要用四条记录,你上面这个你需要用365条记录。
04:19
那很显然,一个用户我就节约了这么条数据,这么多条数据,那我要是1亿个。对吧,这个数据量是非常非常可观的。啊,所以说呢,我们就会把这种类似于这种状态的表,把它做成拉链表啊,变成这表啊一个区间范围。OK,那么继续。那下面我们来看一下。如果我们做成了一个拉力表之后,那么我们如何来使用或者去查这个拉力表,比如说这是一个拉力表数据。这么多数据啊,这个是一号订单从开始到结束,二号订单待支付已支付啊,它表示了两种状态。
05:05
好,那跟针,呃,针对上面这张表,这个拉单表我们进行查询,比如说我想查询一下1月1号。这一时刻所有订单的状态。那我就可以通过时间的一个判断查询出来,在1月1号当天,你看。一号订单处于待支付,二号订单你看1月1号它就是待支付。然后三张订单1月1号已支付。啊,它表示的是你不是变化吗?但是我关心的是即使你变化,就这一时刻你肯定是不变的,那就是1月1号这一天,你到底是什么状态啊,这有助于什么呢?比如说到周或者月或者年的时候,我要做一个统计,那比如说到那个12月30号这一天,比如说月的一个结束,或者年的结束,那我就想算一下这一时刻有多少个订单还没有被支付。
06:08
啊,他算的是这种,或者查询的是这种状态,好,那比如说1月2号,我查一下1月2号,那你会发现这是1月2号这五个订单,那1月2号这个二号订单他就是。变成已支付了。啊,你说当前这一时刻,每一个订单只有唯一的一种状态。啊,V的状态啊,是这个含义,这就是如何来使用这个拉链表啊去查询哈,好。那下面我们来看一下拉链表如何来制作啊,以及它形成的一个过程啊。那首先来看2019年1月1号订单全量表,也是这是订单表啊订单表,这个订单表目前存储在每存里面。
07:00
啊看啊每最后里面订单,那比如说123订单分别的状态,待支付待支付已支付好,那怎么把它变成拉链表呢。只需要在订单的每条后面加上两列,分别是生效的开始日期和结束日期。在原来的基础上就加上这么一个东东。那有同学说这个日期怎么加,那就是你看你今天订单是哪天产生的,比如说1月1号产生的,那我这块加的开始日期就是一号结束日期永远都是。永远到达了,到达不了的就就有表示至今所就说从这一天开始,这就是初始化,第一张拉链表就有了。那有了这个拉力表之后,好,那么到了第二天,也就是1月2号的时候,是不是还会产生力呢?啊,还会产生订单,那么产生订单这里面就会有两种情况发生,一种情况是有新增压的订单进来。
08:07
还有一种是对已有的订单状态的一个修改。啊,由待支付变成已支付。是这样吗?啊是这样好,那既然有了这种状态,我们之前在导表的时候说过,对订单表导的是它的全量啊,导的是它的新增和变化,这表示新增,这表示变化,是这样吗?好。那把它的新增和变化导入到这张表里面,比如说我们每天导的数据是这些,你像这个一号订单,他状态没有发生变化,也不是新生,我就不会去找他了。那这就是我们要到的那边,试官总会问说,你导这个新生的变化靠的是什么?它的创建时间和操作时间是今天,那我就把它找过来。
09:01
那通过这一个过滤,我就能得到对应的新增和变化好。那下面就能形成根据之前的初始方达的表和新增和变化的表,就能得到我们对应的。拉在这把它进行合并,那也就是说合并,那这怎么合呀,很简单来看。对应着这边新增和变化的表,你先看它的新增,新增字段的处理,只是在它后面加上两列啊,这两列标记的就是它的开始日期和结束日期,那你看吧,这两个。只是在拿后面加上开始日期和结束日期。那对应的开始日期和结束日期是1月2号,那我就1月2号拿回来。没问题吧,好,然后你再看这是原来的初始化的拉链表,那它没变。
10:02
他没变,哎,不是他啊,是下一个啊。他没变啊,他没变,然后你把这张表里的内容全部只是在他末位加上对应的开始日期和结束日期,对吧,目前这些都搞定了,那现在只差了一条。正常。啊,因为这条是相当于被他修改了啊,修改其他的逗号处里边,哎,只是变成加上两个字段而已。那你说目前,而且就是只是修改它。继续了这么一个阶段。那这么一个车就相当于面解决什么问题呢?一个have表当中,我只想修改某一个字段。解决这个问题。那在汉表当中,当然解决它比较困难,怎么解决呢?我修改你一个字段,修改不了,我就修改你全面。
11:05
我创建一张中间临时表啊,然后再给你覆盖过去啊,那这个方式我们可以看一下啊,看一下具体的这个实现过程,看这。拉列表制作过程啊,你直接看这吧,比如说这是我们第一天开始做的这个拉列表首日啊,然后呢,订单拉列表初始化一下,那只是在原来的订单表后面加上两列开始日期和结算日结束日期。之后第二天买circle里面会产生对应的新增数据和变化数据,那好,那这里面就简单了,我把订单拉链表的数据和他新增和变化的数据进行照引。招应完就形成了一张临时的拉链表,那这里面就能把对应的字段全部都修改完,修改完之后。
12:05
哎,我把这张临时表覆盖给原来的这个订单拉链表,就是初始化的拉链表,那它就变成当前最新的拉链表,那之后再过一天又会产生。数据才是数据,那好,那他们两个再进行找一。啊,然后再进行覆盖啊,这个交替式的一个一个覆盖,比如说从第一天开始一直好啊,就是这些东西。啊,进账一个过程,那我们来看一下理论订单当日的全部数据。和满石核中每天变化的数据拼接在一起,就形成了一张临时拉链表,用临时拉链表覆盖旧的拉链表啊,因为它覆盖就得到了最新的数据,那它解决的就是还表当中数据不能更新的问题啊,就解决这个问题啊好,那下面我们来具体的去制作一下这个拉链表。
我来说两句