一、爲什麼要數據建模
什麼是數據倉庫?數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合,用於支持管理決策。
什麼是數據建模?如何將數據倉庫的數據進行有序、有結構地分類組織和存儲,這便是數據建模。
好的數據建模方案,應該具備哪些特性:
1)使用:良好的數據模型能幫助我們快速查詢所需數據,改善用戶使用數據的體驗,提高使用數據的效率;
2)質量:良好的數據模型能改善統計口徑的不一致性,減少數據計算錯誤的可能性;
3)成本:良好的數據模型能極大減少不必要數據的冗餘,實現計算結果複用,降低數據存儲和計算的成本;
4)性能:良好的數據模型能加速數據加工進程,縮短數據產出時間。
二、有哪些數據建模方法論
ER建模、維度建模、DataVault建模等等。
本文主要遵循維度建模思想,以電商普遍的分析決策需求出發來構建公共數據層模型。
三、數據倉庫建模原則
1)高內聚低耦合:將業務相近的放在一起,將高概率使用的放一起,遵循軟件設計開發的高內聚低耦合原則
2)公共處理邏輯下沉:越是底層公用的處理邏輯越應該在數據調度依賴的底層進行封裝,公共邏輯不應該多處同時存在
3)數據可回滾:處理邏輯不變,在不同時間多次運行數據結果不變
4)一致性:相同含義的字段在不同表中必須使用相同的命名以及類型,表名必須清晰,包含層次結構,易於理解
5)評審機制:模型設計必須進行評審,以確保模型實施過程的正確性
四、數據倉庫模型層次劃分
1)操作數據層ODS(Operational Data Store):貼源設計,存放各源系統數據,只做簡單清洗;結構化數據增量或全量同步,非結構化數據結構化處理
2)公共數據層CDS(Common Data Store):維度建模設計,存放明細數據、公共指標彙總數據以及維表數據
2-1)明細數據層CDDS(Detail Data Store):存放細粒度事實表數據(dwd)及維表數據(dim)
2-2)彙總數據層CSDS(Summary Data Store):存放粗粒度事實表數據(dws)
3)應用數據層ADS(Application Data Store):應用驅動設計,存放數據產品個性化的指標數據;基於應用的數據組裝
五、數據倉庫規範定義
名詞定義:
1)數據域:
指面向業務分析,將業務過程或者維度進行進行抽象的集合。
數據域需要長期維護和更新,但不輕易變動。
在劃分數據域時,既能涵蓋當前所有的業務需求,又能在新業務進入時無影響的被包含進已有的數據域中和擴展新的數據域。
2)業務過程:指企業的業務活動事件,如下單、支付都是業務過程。業務過程是一個不可拆分的行爲事件。
3)度量:某一業務事件行爲下的度量,是業務定義中不可再拆分的指標,具有明確業務含義的名詞,如支付金額
4)維度:維度是度量的環境,用來反映業務的一類屬性。
命名規範:
1)物理模型表名命名規範:
ods:ods.源數據庫名_源數據庫表名
dwd:dw.dwd_數據域_業務過程
dws:dw.dws_數據域_業務過程_彙總週期
dim:dw.dim_數據域_維度名
ads:ads.分析主題_分析內容
2)物理模型字段命名規範:
命名約定:
優先使用英文簡寫來命名,其次是英文全稱,如英文全稱過於複雜,使用漢語拼音首字母替代
維度屬性:
儘可能使用英文縮寫
度量命名:
原子指標:動作_度量,如銷售數量 sales_num
派生指標:原子指標[時間週期][修飾詞],如3C品類最近7天商品銷售數量 sales_num_7d_3c
六、數據倉庫數據域劃分
1)用戶域(user):註冊、存量等
2)商品域(goods):上架、下架、存量等
3)交易域(trans):下單、支付等
4)日誌域(log):訪問、曝光、點擊、下單、加購等
5)客服域(cs):諮詢、投訴等
6)互動域(in):評論、抽獎等
7)供應鏈域(sc):採購、物流等
8)公共域(com):時間維度、地理維度等
七、維度與事實表設計原則
1)儘可能生成豐富的維度屬性
2)儘量沉澱出通用的維度屬性
3)儘可能包含所有與業務過程相關的事實
4)只選擇與業務過程相關的事實
5)分解不可加性事實爲可加的組件
6)同一個事實表中不能存在多種不同粒度的事實
7)事實表的單位要保持一致
8)對事實表的null值要處理
八、用戶域數據建模
1)用戶註冊事實表 dw.dwd_user_register 無事實的事實表
主鍵 用戶編號 user_id
外鍵 來源編號 source_id
外鍵 設備編號 eqpt_id
日期維度 註冊時間 reg_time
雜項維度 註冊方式(手機、郵箱等) reg_type
雜項維度 註冊平臺(app、m站、pc站等) platform
雜項維度 註冊IP ip
雜項維度 推薦人用戶編號 parent_id
分區鍵 註冊日期 reg_date
2)用戶維表 dw.dim_user 維度表
分區主鍵 用戶編號 user_id
用戶維度 用戶賬號 user_name
用戶維度 用戶郵箱 email
用戶維度 用戶手機 mobile
用戶維度 用戶暱稱 nickname
用戶維度 用戶等級 user_lvl
用戶維度 用戶餘額 balance
用戶維度 用戶積分 integral
分區鍵 數據日期 data_date
可考慮使用拉鍊表形式進行存儲
九、商品域數據建模
1)商品上下架事實表 dw.dwd_goods_on_off_sale 多事務事實表:商品上架、商品下架
商品維度 商品編號 goods_id
日期維度 上架時間 on_sale_time
日期維度 下架時間 off_sale_time
雜項維度 下架原因 off_sale_reason
雜項維度 上下架類型 operation_type
分區鍵 數據日期 data_date nvl(off_sale_time, on_sale_time)
off_sale_time - on_sale_time 可以計算商品在架時間
2)商品維表 dw.dim_goods 維度表
分區主鍵 商品編號 goods_id
外鍵 類目編號 cat_id
外鍵 供應商編號 supplier_id
商品維度 商品名稱 goods_name
商品維度 商品貨號 goods_sn
商品維度 商品鏈接 goods_link
商品維度 商品季節 goods_season
商品維度 品牌名稱 brand_name
商品維度 風格名稱 style_name
商品維度 商品屬性 goods_attr 以key-value拼接成json形式存儲
商品維度 首次上架時間 first_on_sale_time
商品維度 最近下架時間 last_off_sale_time
商品維度 最近下架原因 last_off_sale_reason
商品維度 累計在架天數 on_sale_days
商品維度 是否在架 is_on_sale
分區鍵 數據日期 data_date
可考慮使用拉鍊表形式進行存儲
3)商品SKU維表 dw.dim_goods_sku 維度表
分區主鍵 SKU編號 sku_id
外鍵 商品編號 goods_id
SKU維度 是否啓用 is_enable
SKU維度 SKU顏色 sku_color
SKU維度 SKU尺寸 sku_size
SKU維度 SKU重量 sku_weight
SKU維度 SKU長 sku_length
SKU維度 SKU寬 sku_width
SKU維度 SKU高 sku_height
SKU維度 SKU成本價 cost_price
SKU維度 SKU吊牌價 shop_price
SKU維度 SKU售價 promote_price
SKU維度 SKU促銷開始時間 promote_start_time
SKU維度 SKU促銷結束時間 promote_end_time
分區鍵 數據日期 data_date
可考慮使用拉鍊表形式進行存儲
4)商品類目維表 dw.dim_goods_cat 維度表
分區主鍵 類目編號 cat_id
類目維度 類目名稱 cat_name
類目維度 類目描述 cat_desc
類目維度 類目層級 cat_lvl
類目維度 是否葉子節點 is_leaf
類目維度 父級類目編號 parent_id
類目維度 父級類目名稱 parent_name
類目維度 是否啓用 is_enable
類目維度 一級類目編號 cat_lvl1_id
類目維度 一級類目名稱 cat_lvl1_name
類目維度 二級類目編號 cat_lvl2_id
類目維度 二級類目名稱 cat_lvl2_name
類目維度 三級類目編號 cat_lvl3_id
類目維度 三級類目名稱 cat_lvl3_name
分區鍵 數據日期 data_date
可考慮使用拉鍊表形式進行存儲
十、交易域數據建模
1)交易事實表 dw.dwd_trans_order 多事務事實表:下單、支付
主鍵 子訂單編號 sub_order_id
外鍵 父訂單編號 order_id
外鍵 用戶編號 user_id
外鍵 商品編號 goods_id
外鍵 SKU編號 sku_id
外鍵 類目編號 cat_id
外鍵 優惠編號 discount_id
日期維度 下單時間 order_time
日期維度 支付時間 pay_time
雜項維度 是否當天下單 is_order
雜項維度 是否當天支付 is_paid
雜項維度 下單時SKU吊牌價 shop_price
雜項維度 下單時SKU售價 promote_price
度量 購買數量 order_num
度量 購買全額 order_amt
度量 購買優惠金額 order_discount
分區鍵 數據日期 data_date nvl(pay_time, order_time)
2)訂單維表 dw.dim_order 維度表
主鍵 訂單編號 order_id
外鍵 優惠編號 discount_id
訂單維度 下單平臺(app、m站、pc站等) platform
訂單維度 支付方式編號 pay_id
訂單維度 支付方式名稱 pay_name
訂單維度 支付平臺(app、m站、pc站等) platform
訂單維度 收貨人姓名 name
訂單維度 收貨人電話 mobile
訂單維度 收貨人省份 province
訂單維度 收貨人城市 city
訂單維度 收貨人詳細地址 address
訂單維度 物流商編號 lp_id
訂單維度 物流商名稱 lp_name
訂單維度 物流單號 logistics_id
分區鍵 數據日期 data_date
可考慮使用拉鍊表形式進行存儲
十一、日誌域數據建模
持續更新中,在後續文章中闡述