如何处理重复的查找信息

cod*_*ger 3 data-warehouse database-design sql-server

我有多个数据库要存储在一个数据仓库数据库中。我想知道如何设计导入过程来处理多个查找表。

例如,假设我有 5 个数据库,所有数据库都带有查找表 CustomerState。在一个数据表中,它可能如下所示:

在此处输入图片说明

在另一个数据库中,它可能如下所示:

在此处输入图片说明

我应该如何在我的 DW 数据库的企业层中处理这个问题?我是否将 SourceSystemId 添加到查找表中,可能是这样的:

在此处输入图片说明

然后在我的客户表中使用 pkyCustomerStateId 而不是 CustomerStateId?

Jon*_*gel 6

这种类型的事情应该由将数据带入数据仓库的 ETL 过程处理。其实这个过程就是ETL中的T。

您首先需要做的是定义表的逻辑键列,因此可以在数据库之间等同于行的业务含义。您建议的多列键会使问题复杂化,实际上并不能解决问题。

对于此示例,我将定义CustomerState为维度中的逻辑键列,当单独的表合并在一起时,该列在结果中将是唯一的,并CustomerStateId分配新值。这确保维度主键尽可能窄,这将贯穿到事实表并使它们也尽可能窄。

ETL 过程可能会做这样的事情(假设CustomerStateId目标表的IDENTITY列是一列):

MERGE INTO [dbo].[CustomerState] tgt
    USING [Staging].[CustomerState] src ON src.CustomerState = tgt.CustomerState
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (CustomerState) VALUES (src.CustomerState);
Run Code Online (Sandbox Code Playgroud)

(我使用MERGE而不是的原因INSERT是,在其他维度中,您可能还需要处理更新;在这种情况下,因为没有其他列。)

然后,事实表加载过程将使用查找机制(SSIS 中的查找转换)从CustomerState逻辑值转到CustomerStateid上述语句生成的新分配值。