【问题标题】:creating dimension surrogate keys创建维度代理键
【发布时间】:2016-03-19 21:24:51
【问题描述】:

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

【问题讨论】:

  • 你能发布你的事实/维度的 ERD 来帮助解释吗?

标签: data-warehouse dimensional-modeling surrogate-key


【解决方案1】:

要严格回答“我如何将它们链接到我的事实表的外键”这个问题,您应该首先通过分配代理键来加载您的维度,然后通过按业务键查找维度来加载您的事实并找到代理键和用它来存储事实。或者,在迟到维度的情况下,如果在事实加载时无法通过业务键找到维度成员,则使用业务键创建维度成员并使用分配的代理键。稍后,当维度成员到达 DWH 时,只需更新其中的其他属性。

从实际的角度来看,如果不需要近乎实时的 DWH,或者如果您每天仅更新两次 DWH,例如在晚上和午餐时间,并且只需几分钟即可从从头开始,如果您的主要事实表只有几百万条记录,那么不要打扰代理键。在实践中,如果您的工作量非常大并且有数百万个事实,这很好。你可以通过阅读这篇文章获得一些见解https://technet.microsoft.com/en-us/magazine/2008.04.dwperformance.aspx

如果您想使用非常大的 DWH,例如大规模并行 DWH 或 Hadoop 技术,那么您应该将代理键更改为哈希键,以最大程度地减少数据移动,避免数据倾斜并提供平衡的执行。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 最后一段回答了这个问题,关键概念是 lookup - 一种用于将自然键替换为代理键的转换。它可能就像在自然键上的事实表和维度表之间的 JOIN 一样简单。
    【解决方案3】:

    代理键分配是在加载事实表的 ETL 过程中实现的。

    自然键,例如产品代码 ABSFG-QXYX-12673726 使用专用映射表映射到通常为整数的代理键,例如 1238。

    代理键很有用,应在以下情况下部署

    • 自然键是可变的,即尽管自然键发生变化,您仍需要使用相同的代理键进行报告

    • 自然键可以重复使用,即您获得相同的自然键,但必须将其报告为新实体

    • 自然键不方便,例如极长的哈希码,可能对存储、连接或排序造成问题

    在某些用例中,代理键的使用应该受到严格质疑:

    • 自然键(例如从源系统中提取的键)已经是代理项(例如序列生成的键)

    • 系统无法提供有关自然键的附加信息(例如更改或重用信息);即代理键实际上是自然键的 1:1 映射。

    • 切勿将代理键用于时间维度,尤其是在事实表按时间进行范围分区时(因为代理键会禁用范围分区修剪)。

      李>

    代理键也有其缺点

    • 需要ETL过程中的映射(性能)

    • 最终报告可能需要反向映射到自然键(性能)

    • 一致性 - 如果出现“未知”自然键,您必须处理代理键映射失败的情况。是拒绝事实记录还是(不完整)映射表的问题?

    • 当然,代理键映射中的 ETL 错误会导致问题……

    所以总结一下,我会说是的,使用代理键有充分的理由,但也有不使用代理键的充分理由。您应该始终仔细检查源系统的接口,并检查每个维度键是否使用代理键的利润更高成本。

    【讨论】:

    • 问题不在于代理键的优缺点(如我第一句话所述),而是如何将事实表中的自然外键转换为代理键?我已经知道如何在维度中创建代理键。谢谢
    • @Davide - 你完全正确。这当然更难回答。我会尝试添加/重新表述我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多