我正在尝试构建一个小型的、手动编写的 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 服务。
我很高兴收到有关该问题的任何意见。如果我无法准确描述我要实现的目标,对此表示抱歉。
这里的正常解决方案是
将每个源暂存在一个单独的表中,因为架构可能因源而异。 如果您控制源系统并保持它们的模式同步,和/或它们数量很大,您可以将它们放在一起。
除了新的代理主键之外,还将“SourceSystem”和“SourceSystemID”作为备用键添加到目标 DW 表中。