一、数据仓库
数据仓库是一个面向主题的、集成的、相对稳定的、反应历史变化的数据集合,用于支持管理决策。
l 面向主题:传统的数据库是面向事务处理的,而数据仓库是面向某一领域而组织的数据集合,主题是指用户关心的某一联系紧密的集合。
l 集成:数据仓库中数据来源于各个离散的业务系统数据库、外部数据、非结构化数据的集合,数据仓库数据是集成的。
l 相对稳定:数据仓库中的数据不应该支持dml操作,而是通过批处理方式进行数据的处理。
l 反应历史:数据仓库保存了数据的历史各个版本。
我们今天所介绍的就是数据仓库保留数据历史版本的一种方法-拉链表。
这里我简单介绍一下我们数据仓库中扫采用的架构,主要包括贴源层、明细层、汇总层、集市层、报表层、维度层,简单的介绍如下:
l 贴源层:采集的各个业务系统数据首先存储在贴源层中,这里需要注意的是采集业务源数据的方法,增量采集还是全量采集,好的业务系统设计应该支持增量采集(这里留一个问题作为思考:增量采集数据应该满足哪些要求),这样的好处减少了采集数据对仓库资源和业务系统资源的消耗。
l 明细层:该层采用规范化方式存储数据,处理数据主要来自于贴源层,实现的目的主要包括面向主题设计存储结构、集成不同业务源数据、统一编码规范、保留历史数据(拉链表主要在这一层中进行设计实现)等仓库基本要处理的
l 汇总层:对于明细层整合的数据,针对需要汇总的指标按照业务口径进行计算并且初步反规范化设计实现连接明细层的规范化数据成小宽表,目的方便下一步处理使用。
l 集市层:面向不同需求方,按照维度建模方法,进行星型模型设计, 这一层设计完成后的目的要达到可以方便出具报表和日常提数任务。这里有些仓库设计人员还会用另一个思路,即集市层不采用星型模型设计方法,而是设计大宽表,采用这种方式的设计人员主要理由是这种方式方便人们使用。
l 报表层:根据各个部门不同需求出具报表。
l 维度层:统一存储数仓维表相关数据。
目前数据仓库设计主要有两个阵营,kimball和inmon架构,这里不会针对与这两种放进进行详细说明。个人所接触项目经验,如果极端采用某一种架构,最后数仓项目成功概率都很低,因此个人建议结合两种架构的优点进行数仓设计(即三范式简历数仓明细层,集市层采用星型模型设计方法),合理结合两种思路优点可以有效的避免业务驱动方式带来的烦杂工作以及需求驱动所带来的后期维护及扩展性问题。
二、拉链表原理
这里以一个虚拟的示例简单介绍拉链表实现原理:
1、比如在2017-01-01日,我们初始化了用户数据到数据仓库,我们为初始化到数据仓库中的用户表(customer)添加了一个start_date和end_date字段用来标识该条数据的生命周期,具体如下:
cus_id job start_date end_date
----------------------------------------------------------------------
10001 oracle 2018-01-01 3000-12-21
10002 pgsql 2018-01-01 3000-12-21
10003 mysql 2018-01-01 3000-12-21
10004 java 2018-01-01 3000-12-21
10005 python 2018-01-01 3000-12-21
2、在2017-01-02这一天,10004用户被删除,同时增加了10006及10007用户,10003用户的job由mysql变成了mongodb,明细数据如下:
cus_id job start_date end_date
--------------------------------------------
10001 oracle 2018-01-01 3000-12-21
10002 pgsql 2018-01-01 3000-12-21
10003 mysql 2018-01-01 2018-01-02
10003 mongodb 2018-01-02 3000-12-21
10004 java 2018-01-01 2018-01-02
10005 python 2018-01-01 3000-12-21
10006 docker 2018-01-02 3000-12-21
10007 redis 2018-01-02 3000-12-21
3、在2017-01-03这一天,10007用户被删除,同时10006工作由docker变成了openstack,10003用户工作由mongodb变成了hive,并且增加了10008用户数据,明细数据如下:
cus_id job start_date end_date
---------------- ----------------------------
10001 oracle 2018-01-01 3000-12-21
10002 pgsql 2018-01-01 3000-12-21
10003 mysql 2018-01-01 2018-01-02
10003 mongodb 2018-01-02 2018-01-03
10003 hive 2018-01-03 3000-12-21
10004 java 2018-01-01 2018-01-02
10005 python 2018-01-01 3000-12-21
10006 docker 2018-01-02 2018-01-03
10006 openstack 2018-01-03 3000-12-21