本文記錄一下商業銀行數據倉庫中的各種表。
寬表,窄表寬表是將多個維度的信息放在一張表中,通常是指業務主題相關的指標、維度、屬性關聯在一起,組成的一張資料庫表。
寬表廣泛應用於數據挖掘模型訓練前的數據準備,通過把相關欄位放在同一張表中,可以大大提高數據挖掘模型訓練過程中,數據在迭代計算時的效率問題。
訂單ID訂單日期收貨城市ID收貨城市用戶 ID用戶姓名用戶年齡購買渠道產品類型----窄表是將不同維度的信息放在不同表中,最後在使用的時候根據公共列進行連接。
比如,訂單表只放了訂單相關信息,用戶表只放用戶相關信息,渠道表只放渠道相關信息。當需要獲取訂單整體情況時,需要把用到的幾張窄表先連接起來,再調取需要的欄位。
訂單ID訂單日期用戶ID產品ID渠道ID窄表嚴格按照資料庫設計三範式,儘量減少數據冗餘,單張表的查詢更快,但是缺點是修改一個數據可能需要修改多張表,並且經常需要與不同的表進行連接操作。
寬表比較方便,不需要做各種連接操作,但是已經不符合三範式的模型設計規範,隨之帶來的主要壞處就是數據的大量冗餘,如果只是查詢某個維度的數據的話會因為查詢了很多沒用的列使得查詢變慢。
第一範式:所有欄位設計,都是不可分解的原子值。
第二範式:確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關
第三範式:確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關
資料庫中對表進行分區的目的是方便管理和查找。常見的分區表是以時間為分區的,比如每天一個分區,或者每月一個分區,如果要查找某天或某月的數據,直接取這一天或這一月的分區下查找即可。將一張表分成若干個區就是分區表,在業務實戰中,數據量大到一定程度都會選擇用分區表的方式存儲數據。
分區表在建表的時候也是用 CREATE TABLE 只是在後面加一個 PARTITION BY 指明按哪個列進行分區,然後查詢的時候,用 WHERE 指明要在哪個分區中查詢。
全量表是存儲了全部數據的表,沒有分區(所有數據在一個分區中)。每次往全量表裡面寫數據都會覆蓋之前的數據,所以全量表不能記錄歷史的數據情況,只有截止到當前最新的、全量的數據。
增量表就是每次把新增的數據追加的原表中,每次新增的數據單獨存在一個分區中。如果是按天分區的,增量表就是記錄每天新增數據的表,比如說,從 4 號到 5 號新增了哪些數據,改變了哪些數據,這些都會存儲在增量表的 5 號分區裡面。
快照表快照表是截至過去某個時間點的所有數據,關注的是過去某個時間點的狀態,每次快照的數據都單獨存儲在一個分區中。
快照表中的數據也叫切片數據,如果要查到歷史數據情況,快照表就有用了。快照表是有時間分區的,每個分區裡面的數據都是分區時間對應的前一天的所有全量數據,比如說當前數據表有3個分區,4號,5號,6號。其中,4號分區裡面的數據就是從歷史到3號的所有數據,5號分區裡面的數據就是從歷史到24號的所有數據,以此類推。
說的快照表的5號分區和4號分區(都是t+1,實際時間分別對應 6 號和 5號 ),它兩的數據相減就是實際時間 5 號到 6 號有變化的、增加的數據,相當於增量表裡面 5 號分區的數據。
拉鍊表拉鍊表存儲了某個主體一整套連續動作的信息。與快照表類似,但是拉鍊表存儲的是在快照表的基礎上去除了重複狀態的數據。
拉鍊表是一種維護歷史狀態,以及最新狀態數據的一種表。拉鍊表也是分區表,有些不變的數據或者是已經達到狀態終點的數據就會把它放在分區裡面,分區欄位一般為開始時間:start_date 和結束時間 end_date。
獲取某一天全量的數據,可以通過表中的 start_date 和 end_date 來做篩選,選出固定某一天的數據。例如我想取截止到 20211212 的全量數據,where 過濾條件就是 where start_date<=20211212 and end_date>=20211212。
流水錶流水錶是存儲了所有修改記錄的表。流水錶與拉鍊表也有點類似,但拉鍊表可以根據拉鏈粒度存儲數據,也就是只存儲特定維度的數據變化記錄,而流水錶存儲的是每一個修改記錄。