cod*_*ger 3 data-warehouse database-design sql-server
我有多个数据库要存储在一个数据仓库数据库中。我想知道如何设计导入过程来处理多个查找表。
例如,假设我有 5 个数据库,所有数据库都带有查找表 CustomerState。在一个数据表中,它可能如下所示:
在另一个数据库中,它可能如下所示:
我应该如何在我的 DW 数据库的企业层中处理这个问题?我是否将 SourceSystemId 添加到查找表中,可能是这样的:
然后在我的客户表中使用 pkyCustomerStateId 而不是 CustomerStateId?
这种类型的事情应该由将数据带入数据仓库的 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
上述语句生成的新分配值。