数据仓库中的各种表

  |  

摘要: 数据仓库中常听到的表是什么意思

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


宽表,窄表

宽表是将多个维度的信息放在一张表中,通常是指业务主题相关的指标、维度、属性关联在一起,组成的一张数据库表。

宽表广泛应用于数据挖掘模型训练前的数据准备,通过把相关字段放在同一张表中,可以大大提高数据挖掘模型训练过程中,数据在迭代计算时的效率问题。

  • 宽表
订单ID 订单日期 收货城市ID 收货城市 用户 ID 用户姓名 用户年龄 购买渠道 产品类型
- - - - - - - - -

窄表是将不同维度的信息放在不同表中,最后在使用的时候根据公共列进行连接。

比如,订单表只放了订单相关信息,用户表只放用户相关信息,渠道表只放渠道相关信息。当需要获取订单整体情况时,需要把用到的几张窄表先连接起来,再调取需要的字段。

  • 订单表
订单ID 订单日期 用户ID 产品ID 渠道ID
- - - - -
  • 用户表
用户ID 用户年龄 产品偏好
- - -
  • 渠道表
渠道ID 渠道信息
- -

窄表严格按照数据库设计三范式,尽量减少数据冗余,单张表的查询更快,但是缺点是修改一个数据可能需要修改多张表,并且经常需要与不同的表进行连接操作。

宽表比较方便,不需要做各种连接操作,但是已经不符合三范式的模型设计规范,随之带来的主要坏处就是数据的大量冗余,如果只是查询某个维度的数据的话会因为查询了很多没用的列使得查询变慢。

第一范式:所有字段设计,都是不可分解的原子值。
第二范式:确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关
第三范式:确保数据表中的每一列数据都和主键直接相关,而不能间接相关

分区表,全量表,增量表

数据库中对表进行分区的目的是方便管理和查找。常见的分区表是以时间为分区的,比如每天一个分区,或者每月一个分区,如果要查找某天或某月的数据,直接取这一天或这一月的分区下查找即可。将一张表分成若干个区就是分区表,在业务实战中,数据量大到一定程度都会选择用分区表的方式存储数据。

分区表在建表的时候也是用 CREATE TABLE 只是在后面加一个 PARTITION BY 指明按哪个列进行分区,然后查询的时候,用 WHERE 指明要在哪个分区中查询。

全量表是存储了全部数据的表,没有分区(所有数据在一个分区中)。每次往全量表里面写数据都会覆盖之前的数据,所以全量表不能记录历史的数据情况,只有截止到当前最新的、全量的数据。

增量表就是每次把新增的数据追加的原表中,每次新增的数据单独存在一个分区中。如果是按天分区的,增量表就是记录每天新增数据的表,比如说,从 4 号到 5 号新增了那些数据,改变了哪些数据,这些都会存储在增量表的 5 号分区里面。

快照表

快照表是截至过去某个时间点的所有数据,关注的是过去某个时间点的状态,每次快照的数据都单独存储在一个分区中。

快照表中的数据也叫切片数据,如果要查到历史数据情况,快照表就派上用途了。快照表是有时间分区的,每个分区里面的数据都是分区时间对应的前一天的所有全量数据,比如说当前数据表有3个分区,4号,5号,6号。其中,4号分区里面的数据就是从历史到3号的所有数据,5号分区里面的数据就是从历史到24号的所有数据,以此类推。

说的快照表的5号分区和4号分区(都是t+1,实际时间分别对应 6 号和 5号 ),它两的数据相减就是实际时间 5 号到 6 号有变化的、增加的数据,相当于增量表里面 5 号分区的数据。

拉链表

拉链表存储了某个主体一整套连续动作的信息。与快照表类似,但是拉链表存储的是在快照表的基础上去除了重复状态的数据。

拉链表是一种维护历史状态,以及最新状态数据的一种表。拉链表也是分区表,有些不变的数据或者是已经达到状态终点的数据就会把它放在分区里面,分区字段一般为开始时间: start_date 和结束时间 end_date。

获取某一天全量的数据,可以通过表中的 start_date 和 end_date 来做筛选,选出固定某一天的数据。例如我想取截止到 20211212 的全量数据,where 过滤条件就是 where start_date<=20211212 and end_date>=20211212

流水表

流水表是存储了所有修改记录的表。流水表与拉链表也有点类似,但拉链表可以根据拉链粒度存储数据,也就是只存储特定维度的数据变化记录,而流水表存储的是每一个修改记录。


Share