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

2021-09-23 17:56:01 字數 1493 閱讀 5545

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

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

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

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

資料倉儲一般分為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層的表進行彙總需要去重。因為同一條記錄可能經過多次修改,這些修改是發生在不同的日期中的。

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

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

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

dw層的資料量 = 生產上所有的資料量(total) - 今天建立的資料量(created) - 今天之前刪除的資料量(deleted)

以表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就不變了。

資料庫與資料倉儲

簡而言之,資料庫是面向事務的設計,資料倉儲是面向主題設計的。資料庫設計是盡量避免冗餘,一般採用符合正規化的規則來設計,資料倉儲在設計是有意引入冗餘,採用反正規化的方式來設計。資料庫是為捕獲資料而設計,資料倉儲是為分析資料而設計,它的兩個基本的元素是維表和事實表。維是看問題的角度,比如時間,部門,維表...

資料庫與資料倉儲

簡而言之,資料庫是面向事務的設計,資料倉儲是面向主題設計的。資料庫設計是盡量避免冗餘,一般採用符合正規化的規則來設計,資料倉儲在設計是有意引入冗餘,採用反正規化的方式來設計。資料庫是為捕獲資料而設計,資料倉儲是為分析資料而設計,它的兩個基本的元素是維表和事實表。維是看問題的角度,比如時間,部門,維表...

資料庫與資料倉儲

資料倉儲用於為決策者提供資訊。為此,資料倉儲必須將來自單位中許多源的資料聚集和合併為一致的資料集,以準確地反映單位的業務運作情況和歷史記錄。單位通常有多個聯機事務處理 oltp 系統來捕獲日常的業務運作情況。這些 oltp 系統很少與資料倉儲同時設計。它們甚至可能是由不同單位設計的,尤其當單位是通過...