两个层次相同但粒度不同的事实表

Posted

技术标签:

【中文标题】两个层次相同但粒度不同的事实表【英文标题】:Two fact tables with same hierachy but different granularity 【发布时间】:2018-05-10 07:44:47 【问题描述】:

假设以下假设情况,我们需要定义两个 Fact 表:

评估事实表

用户 ID 学校编号 课程编号 状态(通过/未通过)

用户响应事实表

用户ID 学校编号 课程编号 主题ID 调查 ID 响应

很明显,我们需要一个用户维度表,但是如何对另一个层次维度进行建模?

我们有两种可能的方法:

1 - 分别对所有维度建模并将它们相互关联(雪花模式)并将事实表与相应维度关联。在这种情况下,我们在构建查询时需要多个连接。

2 - 按照 kimball 的建议,我们应该将所有 1:n 关系统一在一个唯一维度中,但是通过这种近似,我们应该构建两个包含相同信息但粒度不同的维度:

dim 调查

身份证 调查说明 主题ID 主题描述 课程编号 课程说明 主题ID 主题描述 学校编号 学校描述

dimCourse

身份证 课程说明 主题ID 主题描述 学校编号 学校描述

哪种方法更合适?

【问题讨论】:

【参考方案1】:

为什么不创建这样的数据模型: 如果您对如何填充每个表有具体问题,请提供示例数据,我们可能会提供帮助。

更新:根据您下面的问题,您可以使用此模型找到类似的答案,假设用户与学生相同 (将 schoolName 添加到 dim_school 表中)

下面的查询将根据您的 fact_evaluation 表中的数据为您提供关于学校中有多少学生的答案。 如果您一般询问特定学校有多少学生,您需要更多信息,例如入学人数等。

select schoolName, count(distinct userID)
from fact_evaluation f
join dim_school d on d.schoolID = f.schoolID
where schoolName = <a school name>
group by 1

【讨论】:

感谢@mdem7 的回复,但是这种方式不可行,因为我们的事实表是事务事实表,所以我们不会反映所有可能的关系。例如,如果我想知道一所学校有多少学生,我需要学校和学生之间的关系,这个模型不提供给我们。有这个问题的想法吗? 根据您的问题更新了我上面的答案,如果您还有其他问题,请告诉我。

以上是关于两个层次相同但粒度不同的事实表的主要内容,如果未能解决你的问题,请参考以下文章

一个或多个事实表

事实和维度数据仓库 Datamart

DataWarehouse - 具有不同粒度/维度度量的事实表

将一个维度加入具有不同粒度的多个事实表

如何对链接到具有不同粒度级别的多个事实的维度表进行建模?

具有不同更新计划的事实表