事实表相对于维表如何形成?

问题描述

我试图了解事实表相对于维度表的形成方式。

例如销售情况表 对于查询按年/月/周/日的产品销售,我是否为每种期间类型创建维度:Dim_Year,Dim_Month,Dim_Week和Dim_Day,每个都有各自的键? 还是可以在所有期间仅使用一个维度:Dim_Date并且只有一个日期键?

令我困惑的另一个领域是,为什么某些事实表不包含其自己的ID?例如。销售事实表的事实表中未包含SaleID。

Sale Fact Table Textbook Example

解决方法

日期

您的日期维必须与事实表的粒度相对应。因此,如果您有每日销售量,则有Dim_Day,有每周销售量,则有Dim_Week等。

您通常会在数据仓库中拥有多个日期维度(以不同的粒度表示),因为事实会以不同的日期粒度表示。

每个日期维度将包含适用于日期层次结构中更高级别的保持属性。因此Dim_Day可能包含day,week,month,year属性; Dim_Month可能包含月份,季度和年份等属性。

主要密钥

在数据库中创建表时,主键很少(从来没有?)是技术要求,即您可以在不定义PK的情况下创建表。因此,您需要考虑为什么我们通常(至少在OLTP DB中)包含PK。常见原因包括:

  • 轻松识别个人记录
  • 为确保重复记录(具有相同PK值的记录) 未创建

因此创建PK的理由很充分,但是会产生成本开销,例如每次将新记录插入表中时,都需要检查PK。

在要执行批量插入/更新的维模型中,拥有PK会严重影响性能。此外,插入逻辑/检查应始终在ETL流程中实现,因此无需在数据库本身中包括这些类型的检查/约束。

事实表确实具有主键,但是它通常是隐式的而不是显式的-因此事实表中的一组FK唯一地标识每个记录。该复合PK可能已记录在案,但从未启用/实现。

有时,事实表将具有显式的单列PK。通常在需要更新事实表并且其隐式PK涉及大量列时使用此方法。通常需要逻辑来使用其FK来标识要更新的记录,但这会返回PK;那么update语句只有这样的子句:

WHERE table_pk = 12345678

而不是必须将所有列都包含在隐式PK中:

WHERE table_sk1 = 1234
AND table_sk2 = 5678
AND table_sk3 = 9876
....

希望这有帮助吗?