我了解在数据仓库维度中使用代理键有充分的理由。
但是,我仍然不知道如何将它们链接到我的事实表的外键。
在事实表中,我只有自然键,是在ETL期间提取的。替代键在原始数据库表中不存在。
有什么建议吗?谢谢

最佳答案

下面有几个“请参阅”参考。这是我对Stack Overflow的第一个答案,因此我没有足够的信誉点来提供指向您的链接。如果您在Wikipedia上查找这些术语,它们将比我能提供的更有说服力的描述。

在我合作过的数据仓库中,我们通常存储在事实表中引用各个维度的代理键。实际上,除非在特殊情况下(例如degenerate dimensions),否则我避免将来自源系统的自然键存储在事实表中。造成这种情况的原因有两个:


连接效率-一些源系统可能不使用简单的整数键;使用代理键可以降低这种复杂性,从而使数据仓库查询性能更好,因为它只需要处理单列整数联接。


从源系统中提取事实表;您的事实表可能超过了特定的源系统(或源系统的版本),或者事实可能来自具有不同自然键的不同源系统。无论自然键设计如何,事实表和维度表之间的关系都保持不变。
准确高效的时间点事实-如果维度中的属性历史很重要,则可以使用代理键来存储维度行的历史副本,并将更正版本附加到事实表行中(请参阅慢速操作)更改尺寸;尤其是类型2)
该维度可以被来自多个源系统的多个事实表使用,或者可以从多个源系统进行合并,在这种情况下,源系统的自然键和维替代键之间将不会存在简单的关系(请参见“一致的维”)
未知-有时您会遇到以下事实:自然键为NULL,值无效或有些怪异。通过在维表中具有多个特殊行之一来表示“未知”,“无效”,“尚未发生”或其他适当的行,您可以表示该条件并仍保持数据库中的参照完整性。 (从技术上讲,NULL值不是关键,但是某些数据库引擎会让您以数据仓库的性能和可用性为代价而放弃它)
我确定我会忘记一些非常重要的东西...



通常,在加载事实表的转换阶段,我查找来自源系统的自然键的替代键,然后将替代键存储在事实表中,而不是自然键中。我不知道您使用的平台是什么,您可以在大多数数据库平台上使用JOIN来执行此操作。我经常在Microsoft SQL Server平台上使用SSIS查找。

07-28 13:55