維度退化:? 通過減少表的數量和提高數據的冗余來優化查詢性能。
在維度退化中,相關的維度數據被合并到一個寬表中,減少了查詢時需要進行的表連接操作。例如,在銷售數據倉庫中,客戶信息、產品信息和時間信息等維度可能會被合并到一個單一的銷售事實表中。這樣,查詢時只需訪問一個表,而不必連接多個表,從而提高了查詢效率。
做寬表的原因:
把多張表內容合并到一張表>>提升查詢速度
弊端: 占更多的內存
數倉的本質>>用空間換時間
做主題寬表
1.業務人員告知需要的字段>>直接create table
2.業務人員沒有告知
先確定需要用來做寬表的表>>事實表/與主題相關>>確認主表副表(left join)>>重復字段只保留主表的字段
很少選擇第二種>>因為不能寫注釋; 只能建普通表,不能建分區表/分桶表
示例
步驟:?
1.建DWB數據庫
create database dwb;
2.建相應的主題寬表:(比如創建訂單明細寬表)
先從事實表里面確認所需要的表(參照數據字典表了解表的實際內容)
t_goods_evaluation 訂單評價表(主題相關)
t_goods_evaluation_detail 商品評價表(無關主題)
數據字典表(中英對照)
把訂單主表(t_shop_order)確定為表連接的主表,其余為副表
主表的確定
業務需求分析
-
核心業務實體:明確業務需求,找出核心業務實體,如訂單、客戶、產品等。
-
高頻查詢:分析高頻查詢,確定哪些表最常被訪問。
?數據關系分析
-
主外鍵關系:通過主外鍵關系確定主表,通常主表包含核心業務數據,其他表通過外鍵關聯。
-
數據粒度:選擇粒度最細的表作為主表,確保寬表包含最詳細的信息。
?數據量分析
-
數據量大小:選擇數據量較大的表作為主表,避免寬表數據量過大。
-
更新頻率:選擇更新頻率較低的表作為主表,減少寬表維護成本。
工具支持
-
數據建模工具:使用數據建模工具分析表關系,輔助確定主表。
-
ETL工具:利用ETL工具自動化寬表構建,減少手動操作。
表字段的確定
主表字段全部保留
訂單主表(t_shop_order)
副表字段
fact_shop_order_group (訂單組表)
id是自增列,用來確保數據的唯一性(不保留)
order_id 用來和主表關聯的字段,主表已存在(不保留)
其他字段,和主表重復(不保留)
t_shop_order_address_detail(訂單副表)
id是和主表的關聯字段(不保留)
其余字段,和主表重復(不保留)
t_order_pay(訂單支付表)
?t_refund_order (退款訂單表)
t_order_settle(訂單結算表)
t_shop_order_goods_details(訂單商品快照表)
id自增列主鍵(不保留)
order_id 主表關聯字段, 主表已經存在(不保留)
shop_store_id? 店鋪id,?buyer_id? ?買家id 在主表中已存在(不保留)
其他字段, 主表中已經存在(不保留)
t_goods_evaluation(訂單評價表)
?user_id 評論人id=主表的buyer_id? 買家id; 主表已經存在(不保留)
t_order_delievery_item(配送信息表?)
id 自增列(不保留)
shop_order_id 訂單id, 和主表關聯的字段, 主表已經存在(不保留)
refund_order_id 在副表t_shop_order_goods_details(訂單商品快照表)已經存在(不保留)
shop_store_id 店鋪id,?buyer_id? 買家id? 在主表已經存在(不保留)
circle_master_user_id 在副表t_order_settle(訂單結算表)已經存在(不保留)
dispatcher_user_id 在副表t_order_settle(訂單結算表)已經存在(不保留)
sql
create table dwb.dwb_order_detail
as
selecto.id,o.order_num,o.buyer_id,o.store_id,o.order_from,o.order_state,o.create_date,o.finnshed_time,o.is_settlement,o.is_delete,o.evaluation_state,o.way,o.is_stock_up,o.create_user,o.create_time,o.update_user,o.update_time,o.is_valid,og.group_id,og.is_pay,od.order_amount,od.discount_amount,od.goods_amount,od.is_delivery,od.buyer_notes,od.pay_time,od.receive_time,od.delivery_begin_time,od.arrive_store_time,od.arrive_time,op.order_pay_amount,ro.apply_date,ro.modify_date,ro.refund_reason,ro.refund_amount,ro.refund_state,ro.refuse_refund_reason,ro.refund_goods_type,ro.refund_shipping_fee,os.settlement_create_date,os.settlement_amount,os.dispatcher_user_id,os.dispatcher_money,os.circle_master_user_id,os.circle_master_money,os.plat_fee,os.store_money,os.status,os.note,os.settle_time,os.first_commission_user_id,os.first_commission_money,os.second_commission_user_id,os.second_commission_money,ogd.goods_id,ogd.buy_num,ogd.goods_price,ogd.total_price,ogd.goods_name,ogd.goods_image,ogd.goods_specification,ogd.goods_weight,ogd.goods_unit,ogd.goods_type,ogd.refund_order_id,ogd.goods_brokerage,ogd.is_refund,e.geval_scores,e.geval_scores_speed,e.geval_scores_service,e.geval_isanony,odi.dispatcher_order_type,odi.dispatcher_order_state,odi.order_goods_num,odi.delivery_fee,odi.distance,odi.dispatcher_code,odi.receiver_name,odi.receiver_phone,odi.sender_name,odi.sender_phone
from dwd.fact_shop_order o
left join dwd.fact_shop_order_group ogon o.id = og.order_id
left join dwd.fact_shop_order_address_detail odon o.id = od.id
left join dwd.fact_order_pay opon og.group_id = op.group_id
left join dwd.fact_refund_order roon o.id = ro.order_id
left join dwd.fact_order_settle oson os.order_id = o.id
left join dwd.fact_shop_order_goods_details ogdon ogd.order_id = o.id
left join dwd.fact_goods_evaluation eon e.order_id = o.id
left join dwd.fact_order_delievery_item odion odi.shop_order_id = o.id;
寬表查詢
select * from ?dwb.dwb_order_detail;?