我现在试图了解星型图案&在粒度上苦苦挣扎。
假设我有一个具有session_id,user_id,order_id,product_id的事实表,并且我希望按周用户汇总到会话(请记住,并非每个会话都会导致订单或产品& DW需要跟踪非购买用户以及购买者的会话。
我认为没有理由在事实表中跟踪order_ids或session_ids,因此它会变成:
week_date,user_id,total_orders,total_sessions ...
但是,如果用户在一周内进行多次购买,我将如何跟踪product_ids?我假设我不能将多个产品ID保存在一个数组中(例如:" 20/02 / 2012"," 5"," 3",& #34; PR01,PR32,PR22&#34)?
我认为可能需要在每个会话中保留'水平,但可能会导致非常大量的数据。您将如何实现上述示例的粒度?
答案 0 :(得分:0)
尺寸建模需要尺寸和事实。
您需要一个日期/日历维度,其中包含以下列:
calendar (id,cal_date,cal_year,cal_month,...)
" grain"事实表是数据存储的关键。如果您有交易,那么交易应该是粮食,每个交易存储一行。使用适当的(整数)代理键到你的尺寸,你的桌子不会像你担心的那样大。
现在您可以编写一个这样的查询,按年计算产品销售额:
select product_name,cal_year,sum(purchase_amount)
from fact_whatever
inner join calendar on id = fact_whatever.calendar_id
inner join product on id = fact_whatever.product_id
group by product_name,cal_year