天天看點

一種對資料倉庫友好的資料庫設計

系統可以分為兩種:一種是 聯機交易系統(oltp),一種是線上分析系統(olap)。oltp用來收集資料,然後把資料同步到olap,在olap中進行分析資料。

olap可以減少oltp的負載,提高對資料的使用率。

将資料從oltp同步到olap,有兩種方法:全量同步和增量同步。

全量同步:每次把全表資料同步到olap對應的表

增量同步:每次把有變動的資料同步到olap對應的表

與增量同步相比,全量同步每次都要同步所有的資料,花費的時間大,對系統的負載高。

與全量同步相比,增量同步的難點在與如何識别出增量資料。

在建表的時候,包含如下字段:

主鍵:每個表都有一個主鍵

created_time:表明資料是什麼時候建立的,以後一直不變

modified_time:表明資料是什麼時候修改的,每次修改,這個字段都會更新成最新的時間

deleted_flag:不實體删除,如果想要删除資料,就在将這個字段設為true。隻要設定為true之後,以後一直不變,且modified_time也不再改變

資料倉庫一般分為ods層和dw層。ods存儲oltp中的原始資料,同步的過程主要發生在ods層。方法如下:

隻要modified_time為當天的記錄,就是當天的增量資料。

是以,在同步的時候,隻要對modified_time進行判斷即可。

可能出現的異常:

比如,有一條記錄a,建立日期是在20170304,但是在20170305 00:20有修改,然後修改時間變成了20170305。

同步任務本來是在20170305 00:00進行同步,但是由于排程延遲的問題,導緻同步任務在20170305 00:30開始執行。

這個時候,就會漏掉記錄a。因為在同步的時候,記錄a的修改時間已經變成了20170305了。

一種解決辦法是,将同步的條件修改為:

隻要modified_time為當天的記錄,或者created_time為當天的記錄,就是當天的增量資料。

在dw層對ods層的表進行彙總需要去重。因為同一條記錄可能經過多次修改,這些修改是發生在不同的日期中的。

去重的方法是使用分析函數<code>row_number()over(partition by primary_key order by modified_time desc)</code>。即,根據主鍵,取modified_time最新的記錄。

同時在這個過程中,剔除deleted_flag為true的記錄。

在dw層對ods層資料去重之後,就得到了和生産相同的資料。是否真的正确,可以使用如下的方法驗證:

一種對資料倉庫友好的資料庫設計

以表table_a為例子

在這個過程中,不太好了解的是删除的資料量(deleted)的計算方法。可以這樣想:

如果modified_time為今天,那麼可以确定在今天之前,這條資料是存在的,因為deleted_flag為true後modified_time就不變了。