一種對數據倉庫友好的數據庫設計

系統能夠分爲兩種:一種是 聯機交易系統(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就不變了。

相關文章
相關標籤/搜索