2016-02-12 46 views
0

我想了解目前的星型模式&在粒度上挣扎了很多。星型模式中的粒度导致事实表中的多个值?

假设我有一个事实表,它具有session_id,user_id,order_id,product_id,并且我想按用户每周汇总到会话(请记住,并非每个会话都会导致订单或产品& DW需要跟踪非购买用户以及购买者的会话)。

我看不出有任何理由来跟踪在事实表order_ids或session_ids所以它会成为类似:

week_date,USER_ID,total_orders,total_sessions ...

但我怎么会那么跟踪product_ids如果用户在一周内进行多次购买?我假设我不能在一个数组中保留多个产品ID(例如:“2012年2月2日”,“5”,“3”,“PR01,PR32,PR22”)?

我在想它可能不得不保留在'每个会话'级别,但这可能会导致大量的数据。你将如何实现上述例子的粒度?

回答

0

尺寸建模需要尺寸以及事实。

你需要一个日期/日历尺寸,其中包括像这样的列:

calendar (id,cal_date,cal_year,cal_month,...) 

的事实表的“粮”的关键是数据的存储。如果您有交易,那么交易应该是粮食,并且您每笔交易存储一行。使用适当的(整型)代理键来维度,而你的表不会像你害怕的那么大。

现在,你可以写一个这样的查询,通过能概括2007年销售的产品:

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 
+0

谢谢!没有代表upvote,但这是非常有用的! –

相关问题