数仓中的全量表,增量表,拉链表,流水表,快照表

本文深入解析了数据处理中的核心概念,包括流量、存量、增量、全量表、增量表、拉链表、流水表和快照表的区别与应用场景,为理解和设计数据处理流程提供了清晰的指导。

这里写自定义目录标题


预热:
我们先从几个物理概念入手理解什么是流量,存量,增量
(1)存量:系统在某一时点时的所保有的数量;
(2)流量:是指在某一段时间内流入/出系统的数量
(3)增量:则是指在某一段时间内系统中保有数量的变化
(4)增量=流入量–流出量
(5)本期期末存量=上期期末存量+本期内增量
正题

全量表:每天的所有的最新状态的数据。
(1)全量表,有无变化,都要报
(2)每次上报的数据都是所有的数据(变化的 + 没有变化的)
增量表:新增数据,增量数据是上次导出之后的新数据。
(1)记录每次增加的量,而不是总量;
(2)流量是指在一定时间内的增量;
(3)流量一般设计成增量表(日报-常用、月报);
(4)流量和存量的区别:流量是增量;存量是总量;
(5)增量表,只报变化量,无变化不用报

在这里插入图片描述

拉链表:
(1)记录一个事物从开始,一直到当前状态的所有变化的信息;
(2)拉链表每次上报的都是历史记录的最终状态,是记录在当前时刻的历史总量;
(3)当前记录存的是当前时间之前的所有历史记录的最后变化量(总量);
(4)存量是在某一时刻的总量;
(5)存量一般设计成拉链表(月报-常用、日报);
(6)流量和存量的区别:流量是增量;存量是总量;
(7)封链时间可以是2999,3000,9999等等比较大的年份;拉链表到期数据要报0;
(8)拉链表和增量表的共同点:表结构基本一样。
在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间。
拉链表适用于以下几种情况吧 数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业务需求呢又需要统计这种变化状态,每天全量一份呢,有点不太现实, 不仅浪费了存储空间,有时可能业务统计也有点麻烦,
这时,拉链表的作用就提现出来了,既节省空间,又满足了需求。

关于拉链表设计的案例:可以看看下面的博客
http://www.cnblogs.com/wujin/p/6121754.html
https://blog.youkuaiyun.com/mtj66/article/details/78019370
http://www.jianshu.com/p/799252156379
http://lxw1234.com/archives/2015/04/20.htm

流水表:对于表的每一个修改都会记录,可以用于反映实际记录的变更
 区别于拉链表:

拉链表通常是对账户信息的历史变动进行处理保留的结果,流水表是每天的交易形成的历史;

流水表用于统计业务相关情况,拉链表用于统计账户及客户的情况

快照表:
在这里插入图片描述

按照每天存放的数据以及是否按天分区可以分为增量表,全量表和快照表
在这里插入图片描述

### 三级标题:数据仓库中常用的类型及其适用场景 #### 全量表 全量表是指存储了全部据的,通常没有分区,所有据都存储在一个分区中。这种适合存储当前所有据的最新状态,例如用户信息、产品信息等。全量表的一个显著特点是每次更新时都会覆盖之前的据,以确保中始终保存最新的全量据[^1]。 #### 量表 量表是相对于全量表而言的,其特点是每次新据单独存储在一个分区中,历史分区中的据不会发生改变。这种适合记录据的变化过程,尤其是当新据量较大且需要保留历史记录时。例如,用户每天新的订单据可以存储在量表的不同分区中[^2]。 #### 快照 快照用于存储截至过去某个时间点的所有据,关注的是过去某个时间点的状态。每次快照据单独存储在一个分区中,适合记录据在特定时间点的历史状态。例如,用户在某一天的所有状态快照,或者某一天的库存快照等。 #### 拉链 拉链用于存储某个主体的一整套连续动作的信息,与快照类似,但拉链去除了重复状态的据。这种适合记录据的变化历史,尤其是当据状态变化较少时。例如,用户状态的变化记录,只有当状态发生改变时才会新一条记录[^2]。 #### 流水表 流水表用于存储所有修改记录的,与拉链类似,但流水表存储的是每一个修改记录,而不仅仅是状态变化的记录。这种适合记录所有据的变更过程,包括新、修改和删除操作。例如,用户每次状态的改变都会被记录在流水表中[^2]。 #### 分区 分区是将一个大按照某种规则划分为多个小,每个小称为一个分区。这种适合处理大规模据,可以提高查询性能和据管理效率。例如,按时间分区的销售记录,可以将不同时间段的据存储在不同的分区中,便于按时间范围查询。 ### 示例代码:创建分区 以下是一个创建分区的示例代码,展示了如何按时间范围划分分区: ```sql -- 创建主 CREATE TABLE sales ( sale_id INT, sale_date DATE, amount DECIMAL(10,2) ) PARTITION BY RANGE (sale_date); -- 创建分区 CREATE TABLE sales_q1 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2023-03-31'); CREATE TABLE sales_q2 PARTITION OF sales FOR VALUES FROM ('2023-04-01') TO ('2023-06-30'); -- 插入据 INSERT INTO sales (sale_id, sale_date, amount) VALUES (1, '2023-02-15', 100.00), (2, '2023-05-20', 200.00); ``` 该示例展示了如何创建一个按时间范围划分的分区,并插入据。通过这种方式,可以有效地管理大规模据,提高查询性能。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值