社交媒体的星型架构设计
Star Schema Design for Social Media
我是维度建模的新手,阅读了很多 material(star-schema、dimension/fact 表、SCD、Ralph Kimball 的《数据仓库工具包》一书等)。因此,我对维度建模构造有很好的概念性理解,但由于缺乏经验而发现很难应用于用例,需要一些指导。
以推特为例,我想设计一个维度模型来计算-
- DAU(每日活跃用户数)= 在指定日期通过网站或移动应用程序登录和访问 Twitter 的用户数
- MAU(每月活跃用户数)= 在过去 30 天内通过网站或移动应用程序登录和访问 Twitter 的用户数,包括测量日期
- 一条推文的用户参与度 = 总计(点击 + 收藏 + 回复 + 转推)
一个时期(如一个月)的这些指标是该时期内每一天的这些指标的总和。
我想编写 SQL 来按地区(例如:美国和世界其他地区)计算每个季度的这些指标,并计算这些指标的 year-over-year 增长(或下降)。
例如:
以下是我想到的一些细节-
Factless (transaction) fact table for user login activity with grain of 1 row per user per login : user_login_fact_schema (user_dim_key, date_dim_key, user_location_dim_key, access_method_dim_key)
Factless (transaction) fact table for user activity with grain of 1 row per user per activity : user_activity_fact_schema (user_dim_key, date_dim_key, user_location_dim_key, access_method_dim_key, post_key, activity_type_key)
这听起来正确吗?我的模型应该是什么样子?我还可以在这里添加什么 dimensions/facts?
想知道我是否应该将这 2 个表合并为 1 个并将 activity_type 用于登录 'login',但是可能会有大量没有任何 activity 的登录,所以这将倾斜数据。我还遗漏了什么吗?
你应该把数据放在不同的表上,以确保你不会混合不同的谷物。
user_login_fact_schema 可以是基于 user_activity_fact_schema 过滤 activity 类型的物化视图=login 并包括一些排除重复项的逻辑(即,如果您谈论的是每日活跃用户,则每位用户每天登录一次)
您的模型似乎是正确的,它回答了您发布的图表上的问题。
将这两个事实 table 聚合为一个事实 table 与 "UserAction" 维度相结合可能是有意义的,主要是因为登录可以解释为另一个用户操作.
但是,将单独的事实 table 专注于一个指标(或过程)可能更可取,因为它使您能够将 measures/metrics 引入 table,即当您事实 table 不再是事实。它还可以让您免于与另一个维度 (UserAction) 的连接,但如今它变得不那么重要了,因为存储和数据库处理能力正在变得越来越便宜。
我是维度建模的新手,阅读了很多 material(star-schema、dimension/fact 表、SCD、Ralph Kimball 的《数据仓库工具包》一书等)。因此,我对维度建模构造有很好的概念性理解,但由于缺乏经验而发现很难应用于用例,需要一些指导。
以推特为例,我想设计一个维度模型来计算-
- DAU(每日活跃用户数)= 在指定日期通过网站或移动应用程序登录和访问 Twitter 的用户数
- MAU(每月活跃用户数)= 在过去 30 天内通过网站或移动应用程序登录和访问 Twitter 的用户数,包括测量日期
- 一条推文的用户参与度 = 总计(点击 + 收藏 + 回复 + 转推)
一个时期(如一个月)的这些指标是该时期内每一天的这些指标的总和。
我想编写 SQL 来按地区(例如:美国和世界其他地区)计算每个季度的这些指标,并计算这些指标的 year-over-year 增长(或下降)。
例如:
以下是我想到的一些细节-
Factless (transaction) fact table for user login activity with grain of 1 row per user per login : user_login_fact_schema (user_dim_key, date_dim_key, user_location_dim_key, access_method_dim_key)
Factless (transaction) fact table for user activity with grain of 1 row per user per activity : user_activity_fact_schema (user_dim_key, date_dim_key, user_location_dim_key, access_method_dim_key, post_key, activity_type_key)
这听起来正确吗?我的模型应该是什么样子?我还可以在这里添加什么 dimensions/facts?
想知道我是否应该将这 2 个表合并为 1 个并将 activity_type 用于登录 'login',但是可能会有大量没有任何 activity 的登录,所以这将倾斜数据。我还遗漏了什么吗?
你应该把数据放在不同的表上,以确保你不会混合不同的谷物。
user_login_fact_schema 可以是基于 user_activity_fact_schema 过滤 activity 类型的物化视图=login 并包括一些排除重复项的逻辑(即,如果您谈论的是每日活跃用户,则每位用户每天登录一次)
您的模型似乎是正确的,它回答了您发布的图表上的问题。
将这两个事实 table 聚合为一个事实 table 与 "UserAction" 维度相结合可能是有意义的,主要是因为登录可以解释为另一个用户操作.
但是,将单独的事实 table 专注于一个指标(或过程)可能更可取,因为它使您能够将 measures/metrics 引入 table,即当您事实 table 不再是事实。它还可以让您免于与另一个维度 (UserAction) 的连接,但如今它变得不那么重要了,因为存储和数据库处理能力正在变得越来越便宜。