星型模式中的粒度导致事实表中的多个值?

Posted

技术标签:

【中文标题】星型模式中的粒度导致事实表中的多个值?【英文标题】:Granularity in Star Schema leads to multiple values in Fact Table? 【发布时间】:2016-02-12 00:06:05 【问题描述】:

我目前正在尝试理解星型模式,并且在粒度方面遇到了很多困难。

假设我有一个包含 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”、“PR01、PR32、PR22”)?

我认为它可能必须保持在“每个会话”级别,但这可能会导致大量数据。对于上述示例,您将如何实现粒度?

【问题讨论】:

【参考方案1】:

需要维度建模 维度和事实。

您需要一个日期/日历维度,其中包括如下列:

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

事实表的“粒度”是数据存储的关键。如果您有交易,那么交易应该是谷物,并且每个交易存储一行。为您的维度使用正确的(整数)代理键,您的表格不会像您担心的那么大。

现在您可以编写这样的查询,按年份汇总产品销售额:

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

【讨论】:

谢谢!还没有代表投票,但这非常有用!

以上是关于星型模式中的粒度导致事实表中的多个值?的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库星型模式的维度表和事实表中的数据如何?

在星型模式中处理多个粒度

星型模式

使用 Python 从 csv 文件创建星型模式

事实表中的事实值或度量是啥意思?

星型模式 - 外部标识符事实或维度?