创建维度代理键

Dav*_*ide 3 data-warehouse surrogate-key dimensional-modeling

我知道在数据仓库维度中使用代理键是有充分理由的。尽管如此,我还是不明白如何将它们链接到我的事实表的外键。在事实表中,我只有在 ETL 期间提取的自然键。原始数据库表中不存在代理键。对此有何建议?谢谢

小智 5

下面有几个“参见”参考。这是我在 Stack Overflow 上的第一个回答,所以我还没有足够的声望点来向您提供链接。如果您在 Wikipedia 上查找这些术语,它们会提供比我更雄辩的描述。

在我使用过的数据仓库中,我们通常存储引用事实表中各种维度的代理键。事实上,我避免将来自源系统的自然键存储在事实表中,除非在特殊情况下(例如,退化维度)。这有几个原因:

  • 加入效率——一些源系统可能不使用简单的整数键;使用代理键可以降低这种复杂性,以便您的数据仓库查询性能更好,因为它只需要处理单列整数连接。
    • 从源系统中抽象出你的事实表;您的事实表可能比特定的源系统(或源系统的版本)寿命更长,或者事实可能来自具有不同自然键的不同源系统。不管自然键设计如何,事实表和维表之间的关系保持不变。
    • 准确高效的时间点事实 - 如果维度中的属性历史很重要,您可以使用代理键来存储维度行的历史副本并将更正版本附加到事实表行(请参阅慢慢改变维度;尤其是类型 2)
    • 维度可能被来自多个源系统的多个事实表使用,或者我可以从多个源系统合并,在这种情况下,源系统自然键和维度代理键之间不会有简单的关系(请参阅一致维度)
    • 未知数 - 有时您可能会遇到自然键为 NULL、无效值或某些奇怪现象的事实。通过在维度表中使用更多特殊行来表示未知、无效、尚未发生或任何适当的情况,您可以表示该条件并仍然保持数据库中的参照完整性。(从技术上讲,NULL 值不能作为键,但某些数据库引擎会让您以牺牲数据仓库的性能和可用性为代价来逃避它)
    • 我确定我忘记了一些非常重要的...

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

  • 最后一段回答了这个问题,关键概念是 **查找** - 一种用于用代理键替换自然键的转换。它可能就像事实表和维度表之间基于自然键的 JOIN 一样简单。 (2认同)