管理数据仓库中的代理键

时间:2017-12-22 23:14:55

标签: database-design etl data-warehouse

我想构建一个数据仓库,我想使用代理键作为事实表的主键。但问题是,在我的情况下,事实表应该更新。

第一个问题是如何为源系统中的自然键找到相应的自动生成的代理键?我看到一些答案提到了存储自然键和代理键之间对应关系的查找表,但我并不了解它们是如何实现的。应该存储此表的位置:数据仓库本身还是其他地方?

还有第二个问题。源系统已包含事实的代理键,但它们具有16字节的UUID数据类型。并且事实的数量不太可能超过最大整数值(4个字节)。我应该使用源系统提供的UUID来简化ETL,还是应该执行更复杂的ETL并实现我自己的整数代理键以获得更好的性能?

2 个答案:

答案 0 :(得分:2)

我认为其余的已经回答了。关于管理和维护代理密钥,我给你2美分。

在Teradata期间,我经常使用代理键。以下是我多年来学习的关于代理键的一些最佳实践。

  1. 您只能从已批准的主来源生成代理键(in 你的情况是一个特定的API。应该允许不多的API 生成相同的域值。选择一个充当主人的人 为您的域值。例如客户否通常来自CRM 系统,而不是作为主人的计费系统)
  2. 你生成&将它们存储在查找表中(让我们调用它) Customer_SGK)。通常,这些代理关键表不是其中的一部分 您的最终LDM / PDM采用inmon或kimbal方法。这些 驻留在同一数据库服务器中,而不是技术中 元数据架构。让我们称之为架构" My_Tec_Schema"
  3. 在这样的查找表中,您将拥有代理键​​列(例如 Customer_ID),每个主源的源自然键列 (source1_customerNO,source2_customerNO)和一个时间戳保持一个 生成此密钥时的跟踪。
  4. 您的PK是Customer_ID,在此列中可能不是唯一的,因此根据所使用的数据存储技术,您可能需要将其归类为唯一或非唯一主索引/密钥(例如在Teradata中它将是NUPI)。
  5. 您有时必须允许此操作来简化您的ETL过程 为来自的两个不同的自然键加载相同的客户ID 2个不同的源系统,但它们都意味着同一个客户。

  6. 拥有此查找表,您可能需要加载它(生成密钥) 来自您的阶段表/来源ETL中的第一件事 流程。然后从舞台左外加入查找加载 表获取您的代理键并将其加载到您的事实表中 希望也是你的自然钥匙。 (你总是希望拥有它们 因为大多数情况下你会在你的事实表中得到一些孤儿 唯一的快速&恢复这种情况的可靠方法是 您在事实表中的自然键,并使用PK或PI或索引 基于更新操作,这是非常快速而不是完整的表 扫描)

  7. 您可以随时通过自己的事实表隐藏自然键 表示层视图(消费使用的视图) 应用程序&用户同时保留您的表用于ETL目的/ 仅技术人员)
  8. 由于您使用自动编号生成技术;在将数据从一个环境迁移到另一个环境时以及在主要版本期间迁移生产数据时,您必须特别注意。 (你不想拥有 碰撞)
  9. 我可以继续使用代理键。请阅读此高级概述,请询问任何具体问题。我很乐意提供帮助。

答案 1 :(得分:1)

看起来您的问题是: 如果我在一行的初始加载中在我的数据仓库中生成代理键,如何确定在后续加载时是否已生成密钥?是否应该创建查找表,如果是,应该在哪里创建?

注意:如果您可能在数据仓库目标表中包含来自源系统的密钥,即使您认为自己并不需要它。这对于解决ETL问题非常重要。

两个简单的选择:

1。直接针对目标表执行查找(性能可能是大型表上的问题)。

2。创建一个" etl staging lookup"表仅由您的ETL过程使用(但存储在您的数据仓库中)。这是更灵活的选项,但为您的ETL添加了一个额外的步骤。