保持 ETL 暂存中不同来源的数据链接

问题描述 投票:0回答:1

我正在尝试构建一个小型的、手动编写的 ETL 流程,将来自不同来源的数据加载到星型数据仓库(DWH)中,关心来自不同大学的学生。目前,我的方法是首先将数据暂存到暂存区域内,这在实际将非冗余数据加载到维度和事实表之前反映在 DWH 结构中。所有数据库/表都位于 MSSQL Server 2022 上。

反映 DWH 的集结区域的最小化示例如下所示:

 CREATE TABLE [stage].[Stage_Performance]
(
  [ID] INT NOT NULL IDENTITY PRIMARY KEY,
  [Grade] INT NOT NULL,
  [ECTS] FLOAT NOT NULL,
  [StudentLocation_ID] INT FOREIGN KEY REFERENCES [stage].[Stage_StudentLocation](ID)
)

CREATE TABLE [stage].[Stage_StudentLocation]
(
  [ID] INT NOT NULL IDENTITY PRIMARY KEY,
  [Country] VARCHAR(100) NOT NULL,
  [City] VARCHAR(100) NOT NULL,
)

源系统都使用自己的数据库,因此也有自己的身份列等。给出的是我的两个系统,它们保存位置阶段表的学生位置。其中一种是使用单独的表,另一种将其作为单列直接嵌入到条目中。

大学1

CREATE TABLE [dbo].[Student]
(
  [MatrNr] INT NOT NULL PRIMARY KEY,
  LastName VARCHAR(100) NOT NULL,
  MiddleNames VARCHAR(200),
  FirstName VARCHAR(100) NOT NULL,
  MailAddress INT NOT NULL FOREIGN KEY REFERENCES [dbo].[StudentAddress](StudentAddressID),
);

CREATE TABLE [dbo].[StudentAddress]
(
  [StudentAddressID] INT NOT NULL IDENTITY PRIMARY KEY,
  Street VARCHAR(50) NOT NULL,
  HouseNumber VARCHAR(50) NOT NULL,
  Additions VARCHAR(50),
  ZipCode INT NOT NULL,
  City VARCHAR(50) NOT NULL,
  Country VARCHAR(50) NOT NULL
);

大学2

CREATE TABLE [dbo].[Student]
(
  [StudentID] INT NOT NULL IDENTITY PRIMARY KEY,
  [MatrNr] INT NOT NULL,
  FullName VARCHAR(200) NOT NULL,
  FullAddress VARCHAR(300) NOT NULL
)

目前困扰我的是,当将数据加载到暂存区时,如何保持不同行之间的链接完好无损?更准确地说,当从暂存区提取到仓库本身时,如何才能最好地确保大学 1 和大学 2 的单个学生的数据链接都是正确的?

我考虑过使用不同源系统生成的键,但是,由于它们不同步,我最终会在列中得到重复的值,这会在提取数据时导致问题。 此外,我的想法是不使用由多个表组成的暂存区域,而只使用一个表,其中单个学生记录的所有数据只是一行,但到目前为止,它似乎使从暂存到的加载过程变得复杂。 DWH 本身。

由于该项目的目标是在某种程度上半自动化 ETL 的 SQL 代码生成,因此目前不可能使用 Pentahoo 等 ETL 服务。

我很高兴收到有关该问题的任何意见。如果我无法准确描述我要实现的目标,对此表示抱歉。

sql sql-server etl staging-table
1个回答
0
投票

这里的正常解决方案是

  1. 将每个源暂存在一个单独的表中,因为架构可能因源而异。 如果您控制源系统并保持它们的模式同步,和/或它们数量很大,您可以将它们放在一起。

  2. 除了新的代理主键之外,还将“SourceSystem”和“SourceSystemID”作为备用键添加到目标 DW 表中。

© www.soinside.com 2019 - 2024. All rights reserved.