与维度表相关的事实表是如何形成的?

How are fact tables formed in relation to the dimension tables?

我试图了解事实 tables 与维度 tables 的关系。

例如销售事实 Table 对于 year/month/week/day 的产品销售查询,我是否为每种类型的周期创建一个维度:Dim_Year、Dim_Month、Dim_Week 和 Dim_Day ,每个都有自己的钥匙? 或者是否可以对所有时间段只使用一维:Dim_Date 并且只有一个日期键?

另一个让我感到困惑的地方是,为什么有些事实 table 不包含自己的 ID?例如。销售事实 table 没有包含在事实 table 中的 SaleID。

Sale Fact Table Textbook Example

日期

您的日期维度需要与您的事实粒度相对应 table。因此,如果您有每日销售额,您将有 Dim_Day、每周销售额,您将有 Dim_Week,等等

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

每个日期维度将包含适用于日期层次结构中较高级别的保留属性。所以 Dim_Day 可能包含日、周、月、年属性; Dim_Month 可能包含月份、季度和年份属性等。

主键

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

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

因此创建 PK 有很好的理由,但是也有成本开销,例如每次将新记录插入 table.

时都需要检查 PK

在执行批量 inserts/updates 的维度模型中,拥有 PK 会导致显着的性能下降。此外,插入 logic/checks 应始终在您的 ETL 过程中实现,因此无需在数据库本身中包含这些类型的 checks/constraints。

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

偶尔一个事实 table 会有一个明确的单列 PK。这通常在事实 table 需要更新并且其隐式 PK 涉及大量列时使用。通常需要逻辑来识别要使用其 FK 更新的记录,但这 returns PK;那么更新语句只有这样一个子句:

WHERE table_pk = 12345678

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

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

希望这有帮助吗?