我想构建一个数据仓库,我想使用代理键作为事实表的主键。但问题是,在我的情况下,事实表应该更新。
第一个问题是如何为源系统中的自然键找到相应的自动生成的代理键?我看到一些答案提到了存储自然键和代理键之间对应关系的查找表,但我并不了解它们是如何实现的。应该存储此表的位置:数据仓库本身还是其他地方?
还有第二个问题。源系统已包含事实的代理键,但它们具有16字节的UUID数据类型。并且事实的数量不太可能超过最大整数值(4个字节)。我应该使用源系统提供的UUID来简化ETL,还是应该执行更复杂的ETL并实现我自己的整数代理键以获得更好的性能?
答案 0 :(得分:2)
我认为其余的已经回答了。关于管理和维护代理密钥,我给你2美分。
在Teradata期间,我经常使用代理键。以下是我多年来学习的关于代理键的一些最佳实践。
您有时必须允许此操作来简化您的ETL过程 为来自的两个不同的自然键加载相同的客户ID 2个不同的源系统,但它们都意味着同一个客户。
拥有此查找表,您可能需要加载它(生成密钥) 来自您的阶段表/来源ETL中的第一件事 流程。然后从舞台左外加入查找加载 表获取您的代理键并将其加载到您的事实表中 希望也是你的自然钥匙。 (你总是希望拥有它们 因为大多数情况下你会在你的事实表中得到一些孤儿 唯一的快速&恢复这种情况的可靠方法是 您在事实表中的自然键,并使用PK或PI或索引 基于更新操作,这是非常快速而不是完整的表 扫描)
我可以继续使用代理键。请阅读此高级概述,请询问任何具体问题。我很乐意提供帮助。
答案 1 :(得分:1)
看起来您的问题是: 如果我在一行的初始加载中在我的数据仓库中生成代理键,如何确定在后续加载时是否已生成密钥?是否应该创建查找表,如果是,应该在哪里创建?
注意:如果您可能在数据仓库目标表中包含来自源系统的密钥,即使您认为自己并不需要它。这对于解决ETL问题非常重要。
两个简单的选择:
1。直接针对目标表执行查找(性能可能是大型表上的问题)。
2。创建一个" etl staging lookup"表仅由您的ETL过程使用(但存储在您的数据仓库中)。这是更灵活的选项,但为您的ETL添加了一个额外的步骤。