Database design 在数据仓库中管理代理密钥

Database design 在数据仓库中管理代理密钥,database-design,etl,data-warehouse,Database Design,Etl,Data Warehouse,我想建立一个数据仓库,我想使用代理键作为事实表的主键。但问题是,在我的例子中,事实表应该更新 第一个问题是如何在源系统中为自然密钥找到相应的自动生成代理密钥?我看到一些答案提到了存储自然键和代理键之间的对应关系的查找表,但我不明白它们是如何实现的。该表应该存储在哪里:数据仓库本身,还是其他地方 还有第二个问题。源系统已经包含facts的代理键,但它们具有16字节的UUID数据类型。事实的数量不太可能超过最大整数值4字节。我应该使用源系统提供的UUID来简化ETL,还是应该执行更复杂的ETL并实现

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

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


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

看起来您的问题是: 如果我在数据仓库中对行的初始加载生成代理键,那么如何确定在后续加载中是否已经生成了键?是否应该创建查找表?如果是,它将位于何处

注意:如果可能的话,在数据仓库目标表中包括来自源系统的密钥,即使您认为不需要它。它将被证明是解决ETL问题的宝贵工具

两个简单的选择: 1.直接针对目标表执行查找在大型表上可能存在性能问题。
2.创建一个etl暂存查找表,该表仅由etl流程使用,但存储在数据仓库中。这是一个更灵活的选项,但在ETL中增加了一个额外的步骤。

看起来您的问题是: 如果我在数据仓库中对行的初始加载生成代理键,那么如何确定在后续加载中是否已经生成了键?是否应该创建查找表?如果是,它将位于何处

注意:如果可能的话,在数据仓库目标表中包括来自源系统的密钥,即使您认为不需要它。它将被证明是解决ETL问题的宝贵工具

两个简单的选择: 1.直接针对目标表执行查找在大型表上可能存在性能问题。
2.创建一个etl暂存查找表,该表仅由etl流程使用,但存储在数据仓库中。这是一个更灵活的选项,但在ETL中增加了一个额外的步骤。

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

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

只能从中批准的主源生成代理密钥 您的案例是一个特定的API。应该允许使用的API不多 生成相同的域值。选择一个充当主控的 为您的域值。e、 g.客户编号通常来自CRM 系统,而不可能从计费系统作为主系统 您可以生成并将其存储在一个查找表中,让我们调用它 顾客。通常,这些代理键表不是 您在inmon或kimbal进近中的最终LDM/PDM。这些 驻留在同一个数据库服务器中,而不是技术数据库中 元数据模式。让我们把这个模式称为我的技术模式 在这样的查找表中,您将拥有代理键列,例如。 客户ID,每个主源的源自然键列 source1\u customerNO、source2\u customerNO和用于保存 生成此密钥的时间的跟踪。 您的PK是Customer_ID,在本栏中可能不是唯一的,因此根据使用的数据存储技术,您可能必须将其分类为唯一或非唯一的主索引/键,例如在Teradata中,它将是NUPI。 有时,您必须允许这一点来简化ETL过程 为来自的两个不同自然密钥加载相同的客户ID 2个不同的源系统,但它们都表示相同的客户

有了这个查找表,您可能希望加载它并生成键 从您的阶段表/源开始,ETL中的第一件事 过程。然后通过查找从后台加载左外部联接 表来获取代理项键并将其加载到事实表中 希望还有你的天然钥匙。你总是想要它们 因为大多数情况下,你会在事实表和 恢复这种状况的唯一快速可靠的方法是 事实表中的自然键,并使用PK、PI或索引 基于更新操作,非常快速,而不是满表 扫描

您始终可以通过以下方式在事实表中隐藏自然关键点: 表示层视图用户使用的视图 应用程序和用户,同时保留表以用于ETL/ 仅限技术人员 自从你 se自动数字生成技术;在将数据从一个环境迁移到另一个环境时,以及在主要版本中迁移生产数据时,必须特别注意。你不想 碰撞
我可以继续使用代理密钥。阅读本高级概述后,请提出任何具体问题。我很乐意帮忙

我想剩下的问题已经解决了。关于管理和维护代理密钥,我给你2美分

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

只能从中批准的主源生成代理密钥 您的案例是一个特定的API。应该允许使用的API不多 生成相同的域值。选择一个充当主控的 为您的域值。e、 g.客户编号通常来自CRM 系统,而不可能从计费系统作为主系统 您可以生成并将其存储在一个查找表中,让我们调用它 顾客。通常,这些代理键表不是 您在inmon或kimbal进近中的最终LDM/PDM。这些 驻留在同一个数据库服务器中,而不是技术数据库中 元数据模式。让我们把这个模式称为我的技术模式 在这样的查找表中,您将拥有代理键列,例如。 客户ID,每个主源的源自然键列 source1\u customerNO、source2\u customerNO和用于保存 生成此密钥的时间的跟踪。 您的PK是Customer_ID,在本栏中可能不是唯一的,因此根据使用的数据存储技术,您可能必须将其分类为唯一或非唯一的主索引/键,例如在Teradata中,它将是NUPI。 有时,您必须允许这一点来简化ETL过程 为来自的两个不同自然密钥加载相同的客户ID 2个不同的源系统,但它们都表示相同的客户

有了这个查找表,您可能希望加载它并生成键 从您的阶段表/源开始,ETL中的第一件事 过程。然后通过查找从后台加载左外部联接 表来获取代理项键并将其加载到事实表中 希望还有你的天然钥匙。你总是想要它们 因为大多数情况下,你会在事实表和 恢复这种状况的唯一快速可靠的方法是 事实表中的自然键,并使用PK、PI或索引 基于更新操作,非常快速,而不是满表 扫描

您始终可以通过以下方式在事实表中隐藏自然关键点: 表示层视图用户使用的视图 应用程序和用户,同时保留表以用于ETL/ 仅限技术人员 由于您使用自动编号生成技术;在将数据从一个环境迁移到另一个环境时,以及在主要版本中迁移生产数据时,必须特别注意。你不想 碰撞
我可以继续使用代理密钥。阅读本高级概述后,请提出任何具体问题。我很乐意帮忙

谢谢你的评论!我还有一个问题。我将在数据仓库中使用RDBMS,我想使用一个自动递增的主键。当我第一次向表中插入任何内容时,如何知道RDBMS生成了什么主键?我是否必须在插入行后立即选择该行才能知道生成了什么键?嗨,丹尼斯。。您使用哪种技术平台来构建数据仓库?你会采用金球还是因蒙的方法?我将采用金球方法。源系统是一个JSON API,我将使用PostgreSQL作为我的RDBMS。对于ETL,我将使用python,因为它适合我的情况。我想我已经找到了这个帖子中第二个问题的答案:谢谢你的评论!我还有一个问题。我将在数据仓库中使用RDBMS,我想使用一个自动递增的主键。当我第一次向表中插入任何内容时,如何知道RDBMS生成了什么主键?我是否必须在插入行后立即选择该行才能知道生成了什么键?嗨,丹尼斯。。您使用哪种技术平台来构建数据仓库?你会采用金球还是因蒙的方法?我将采用金球方法。源系统是一个JSON API,我将使用PostgreSQL作为我的RDBMS。对于ETL,我将使用python,因为它适合我的情况。我想我已经在这个帖子中找到了我的第二个问题的答案:为什么我要在数据仓库中存储“ETL暂存查找”表?我能把它存储在内存中吗?@DenisArharov-我不相信postgres有能力将表存储在内存中。你指的是一个临时表吗?我的意思是,也许我可以创建一个python字典,并在其中存储自然密钥、代理密钥对?会吗
比从Postgres中检索更快?将其保存在数据库中可确保在您必须从备份中还原数据库时,它已就位。非常感谢您的帮助!为什么要在数据仓库中存储“ETL暂存查找”表?我能把它存储在内存中吗?@DenisArharov-我不相信postgres有能力将表存储在内存中。你指的是一个临时表吗?我的意思是,也许我可以创建一个python字典,并在其中存储自然密钥、代理密钥对?它会比从Postgres中检索更快吗?如果您必须从备份中还原数据库,将其保存在数据库中可确保它处于适当位置。非常感谢您的帮助!