一种对数据仓库友好的数据库设计

系统能够分为两种:一种是 联机交易系统(OLTP),一种是在线分析系统(OLAP)。OLTP用来收集数据,而后把数据同步到OLAP,在OLAP中进行分析数据。
OLAP能够减小OLTP的负载,提升对数据的利用率。sql

数据同步方法

将数据从OLTP同步到OLAP,有两种方法:全量同步和增量同步。 数据库

  • 全量同步:每次把全表数据同步到OLAP对应的表
  • 增量同步:每次把有变更的数据同步到OLAP对应的表

与增量同步相比,全量同步每次都要同步全部的数据,花费的时间大,对系统的负载高。
与全量同步相比,增量同步的难点在与如何识别出增量数据。数据库设计

OLTP中友好的数据库设计

在建表的时候,包含以下字段: 函数

  • 主键:每一个表都有一个主键
  • created_time:代表数据是何时建立的,之后一直不变
  • modified_time:代表数据是何时修改的,每次修改,这个字段都会更新成最新的时间
  • deleted_flag:不物理删除,若是想要删除数据,就在将这个字段设为true。只要设置为true以后,之后一直不变,且modified_time也再也不改变

同步过程

数据仓库通常分为ODS层和DW层。ODS存储OLTP中的原始数据,同步的过程主要发生在ODS层。方法以下:spa

只要modified_time为当天的记录,就是当天的增量数据。
因此,在同步的时候,只要对modified_time进行判断便可。设计

可能出现的异常:
好比,有一条记录A,建立日期是在20170304,可是在20170305 00:20有修改,而后修改时间变成了20170305。
同步任务原本是在20170305 00:00进行同步,可是因为调度延迟的问题,致使同步任务在20170305 00:30开始执行。
这个时候,就会漏掉记录A。由于在同步的时候,记录A的修改时间已经变成了20170305了。 code

一种解决办法是,将同步的条件修改成:
只要modified_time为当天的记录,或者created_time为当天的记录,就是当天的增量数据。 cdn

去重过程

在DW层对ODS层的表进行汇总须要去重。由于同一条记录可能通过屡次修改,这些修改是发生在不一样的日期中的。
去重的方法是使用分析函数row_number()over(partition by primary_key order by modified_time desc)。即,根据主键,取modified_time最新的记录。
同时在这个过程当中,剔除deleted_flag为true的记录。 blog

数据校验过程

在DW层对ODS层数据去重以后,就获得了和生产相同的数据。是否真的正确,能够使用以下的方法验证: get

DW层的数据量 = 生产上全部的数据量(total) - 今天建立的数据量(created) - 今天以前删除的数据量(deleted) 

check

以表table_a为例子

total = select count(*) from table_a created = select count(*) from table_a where created_time = T+1 deleted = select count(*) from table_a where created_time <= T and modified_time < = T and deleted_flag = true result = total - created - deleted 

在这个过程当中,不太好理解的是删除的数据量(deleted)的计算方法。能够这样想:若是modified_time为今天,那么能够肯定在今天以前,这条数据是存在的,由于deleted_flag为true后modified_time就不变了。

相关文章
相关标签/搜索