3

我正在阅读 Ralph Kimball 关于数据仓库和维度建模的书,在第 6 章中,有关于维度角色扮演的这一部分。

有时您会发现与每笔交易相关的其他日期,例如订单请求的发货日期。每个日期都应该是事实表中的一个外键...... 但是,您不能简单地将这两个外键连接到同一个日期维度表。SQL 会将这种双向同时连接解释为要求两个日期相同,这不太可能。

我不确定我是否理解最后两句话。如果事实表中的两个日期具有不同的值,这是否意味着您不能多次加入日期维度?为什么?

4

2 回答 2

3

它的表达不是很好,但它只是说,如果您要从 Fact 表中的不同 FK 多次加入日期维度,则需要为日期维度添加别名。

这适用于 2 个表不止一次连接在一起的任何 SQL 语句,它并不特定于维度建模。

于 2021-10-16T13:49:06.643 回答
2

这里(很好)隐藏的信息是您需要多个连接 -每个维度角色一个

假设您有一个包含进入日期 entry_d预订日期的事实表 booking_d

这将是错误的,并且可能在文本中意味着

select * from fact
join time_dim tim
on fact.entry_d = tim.date_d and
   fact.book_d = tim.date_d;

使用两个独立的时间维度连接是正确的

select * from fact
join time_dim entr on fact.entry_d = entr.date_d  
join time_dim book on fact.book_d = book.date_d;

另请注意,如果您使用上面示例中的内部连接,则应该对两个日期进行一些基本的验证和清洁。关键是:您应该识别具有无效日期的事实行(未包含在时间维度或 中NULL)并妥善处理它们 - 不要在连接中默默地丢弃它们。

对于非平凡的设置,特别是当事实表在时间列上分区DATE时,您选择本机格式而不是其他维度的代理键。(这是一条实用规则 -理论中未涵盖)

于 2021-10-16T18:35:55.417 回答