大数据仓库之拉链表讲解与举例说明【基础部分】

开门见山,直接切入正题(跟着思路走~~~):

一、.什么是拉链表?

维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的操作记录。(可能不是很理解,往下走~~)

二、为什么要使用拉链表?

在数据仓库中,由于源系统每日会有数据变动,比如新增、修改、删除,如果对每一条记录数据仓库都进行存储,会出现大量重复冗余数据,这样会增加不必要的存储空间,而且会使系统处理效率变低。那么,我们如果采用拉链表形式存储,对数据进行加工,对数据进行开链(start_date)和闭链(end_date),然后根据主键确定一条记录,这样既节约存储空间,又可以随时根据start_date和end_date的范围查询任何时间段的数据记录,如果数据量太大,通过这种查询方法很快就能找到我们需要查询的数据,进而得到我们想要的数据结果。(比如你想知道自己某天的账户余额是多少,想不起来吧,哈哈~~,接着往下走~~)

三、人狠话不多,实例接着说:

假如数据库中有一个user表(数据仓库表,源表),在此表中插入下列测试数据,表中信息如下(仔细看啊~~):

---12月12号,新增3条数据
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(1,'test001',1201,'张三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','张三','TEST-01','测试1','备注1','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','测试2','备注2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(3,'test003',1203,'王五','15900000003','同学','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','测试3','备注3','f');

 ---12月13号,修改id为1的备注信息,并且新增2条数据
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(1,'test001',1201,'张三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','张三','TEST-01','测试1','备注a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','测试2','备注2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(3,'test003',1203,'王五','15900000003','同学','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','测试3','备注3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','测试4','备注4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(5,'test005',1205,'刘邦','15900000005','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','刘邦','TEST-05','测试5','备注5','f');

 ---12月14号,修改id为3的名字(王五-->康熙),id为5的手机号(15900000005-->15999999999),并且新增1条数据
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(1,'test001',1201,'张三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','张三','TEST-01','测试1','备注a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','测试2','备注2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(3,'test003',1203,'康熙','15900000003','同学','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','测试3','备注3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','测试4','备注4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(5,'test005',1205,'刘邦','15999999999','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','刘邦','TEST-05','测试5','备注5','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(6,'test006',1206,'朱棣','15900000006','兄弟','2019-12-14 00:00:00','2019-12-14 00:00:00','朱棣','TEST-06','测试6','备注6','f');

 ---12月15号,删除id为6的数据,并且新增1条数据
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(1,'test001',1201,'张三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','张三','TEST-01','测试1','备注a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','测试2','备注2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(3,'test003',1203,'康熙','15900000003','同学','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','测试3','备注3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','测试4','备注4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(5,'test005',1205,'刘邦','15999999999','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','刘邦','TEST-05','测试5','备注5','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(7,'test007',1207,'刘彻','15900000007','皇室','2019-12-15 00:00:00','2019-12-15 00:00:00','刘彻','TEST-07','测试7','备注7','f');

PS:
1.可以将test表理解为数据仓库,数据仓库中只保留了一份全量数据,如果我要看13号id=1的数据状态,则无法查看;
2.每天都保留一份全量,则数据仓库中的该表共有20条记录,但好多记录都是重复保存,没有任务变化,如id=2,id=4的数据,数据量大了,会造成很大的存储浪费;
3.如果在数据仓库中设计成历史拉链表保存该表,则拉链表中只有10条记录(id=1的有2条,id=2的有1条,id=3的有2条,id=4的有1条,id=5的有2条,id=6的有1条,id=7的有1条);
4.拉链表中end_date=99991231说明该数据处于有效状态(未闭链);
5.如果查询当前所有有效的记录,则:select * from ods_dev.test_zipper_test where end_date='99991231';
6.如果查询某一天的数据状态(历史快照),如查询12号数据的历史快照:select * from ods_dev.test_zipper_test where 
   start_date<='20191212' and end_date>'20191212';
   查询结果和12号数据仓库表(test表)数据完全一致;
7.可以看出,这样的历史拉链表,既能满足对历史数据的需求,又能很大程度上节省存储资源;

四、注意事项:

测试拉链表时需要注意的问题:
1.比如15号有一条数据,16号有一条数据,18号有一条数据,缺少17号的数据;
现补充17号数据(与16号的数据一致),拉链表中数据不变;

关于拉链表的基础讲解已经讲完,如果上述操作你都能看懂,恭喜你已成为数据仓库之拉链表新星一枚,后续会继续更新关于大数据方面的知识,欢迎关注,评论与我交流,如文章有错误之处,还请指正~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章