4

我是维度建模的新手,并且已经阅读了很多材料(星型模式、维度/事实表、SCD、Ralph Kimball 的 - The Data Warehouse Toolkit book 等)。所以我对维度建模结构有很好的概念理解,但由于缺乏经验并且需要一些指导,我发现很难将其应用于用例。

以 Twitter 为例,我想设计一个维度模型来计算 -

  1. DAU(每日活跃用户)= 在给定日期通过网站或移动应用程序登录和访问 Twitter 的用户数
  2. MAU(月活跃用户数)=过去 30 天内通过网站或移动应用程序登录并访问 twitter 的用户数,包括测量日期
  3. 推文上的用户参与度 = 总计(点击次数 + 收藏次数 + 回复次数 + 转发次数)

一段时间内(如一个月)的这些指标是该期间每一天的这些指标的总和。

我想编写 SQL 来按地区(例如:美国和世界其他地区)计算每个季度的这些指标,并计算这些指标的同比增长(或下降)。
例如:在此处输入图像描述

以下是我想到的一些细节-

用户登录活动的无事实(事务)事实表,每个用户每次登录的粒度为 1 行:user_login_fact_schema (user_dim_key, date_dim_key, user_location_dim_key, access_method_dim_key)

用户活动的无事实(事务)事实表,每个用户每个活动的粒度为 1 行:user_activity_fact_schema(user_dim_key、date_dim_key、user_location_dim_key、access_method_dim_key、post_key、activity_type_key)

这听起来正确吗?我的模型应该是什么样子?我可以在这里添加哪些其他维度/事实?

想知道我是否应该将这 2 个表折叠为 1 个并将登录的活动类型设置为“登录”,但是可能有大量登录没有任何活动,因此这会扭曲数据。我还缺少什么吗?

4

2 回答 2

4

您的模型似乎正确,它回答了您发布的图表上的问题。

将这两个事实表聚合到一个与“UserAction”维度连接的事实表中可能是有意义的,主要是因为登录可以被解释为只是另一个用户操作。

但是,将单独的事实表集中在一个指标(或过程)上可能会更好,因为它使您能够将度量/指标引入表中,即当您的事实表不再是无事实的时。它还使您免于加入另一个维度(UserAction),但如今这变得不那么重要了,因为存储和数据库处理能力变得越来越便宜。

于 2018-03-21T11:44:49.223 回答
2

您应该将数据保存在不同的表中,以确保您不会混合不同的谷物。

user_login_fact_schema可以是基于user_activity_fact_schema过滤活动 type=login 并包括一些排除重复项的逻辑的实体化视图(即,如果您正在谈论每日活跃用户,则每个用户每天登录一次)

于 2018-03-20T18:07:55.193 回答