向数据仓库添加新维度(向事实表添加新列)

Posted

技术标签:

【中文标题】向数据仓库添加新维度(向事实表添加新列)【英文标题】:Adding new dimensions to data warehouse (adding new columns to fact table) 【发布时间】:2014-08-27 17:36:07 【问题描述】:

我正在构建一个 OLAP 数据库并且遇到了一些困难。我已经设置了一个包含销售数据列的事实表,例如数量、销售额、成本、利润等。我目前拥有的维度是日期、位置和产品。这意味着我将这些维度表的外键列也包含在事实表中。我已经用这些数据加载了事实表。

我现在正在尝试为销售人员添加维度。我创建了包含销售人员 ID 及其姓名和位置的维度。但是,我无法编辑事实表来添加将作为外键的新列到销售人员维度。

我想使用 SSIS 来执行此操作,通过查找事实表所基于的销售数据库和销售人员 ID,但我首先需要将销售人员列添加到我的事实表中。当我尝试这样做时,我收到一条错误消息,指出它无法创建新列,因为它将填充 NULL。

【问题讨论】:

只是操作顺序问题吗?您可以创建列,然后填充它,然后将其设为外键并将其更改为不允许 NULL 吗? 【参考方案1】:

我将猜测您遇到的问题,但这只是猜测:您的问题有点难以理解。

我将假设您创建了一个包含 x 列的 Fact 表,包括指向日期、位置和产品维度的链接。然后,您已经用数据加载了该事实表。

您现在正尝试向该表添加一个新列 SalesPerson_SK(或 ID)。您不希望在数据库中允许 NULL 值,因此清除“允许 NULL”复选框。但是,当您尝试保存您的工作时,该表会出错,并反对它不能将 NULL 插入 SalesPerson_SK 列。

有几种方法可以绕过这个限制。如果您仍处于开发阶段,这可能是最好的一种方法是发出以下命令:

TRUNCATE TABLE dbo.FactMyFact

这将从表格中删除所有数据,允许您进行更改并重新加载包含新列的表格。

如果由于某种原因你不能这样做,你可以alter the table to add the column but include a default constraint 会放一个default value into your fact table,本质上是一个虚拟记录,上面写着“我不知道这是什么”

ALTER TABLE FactMyFact
ADD Salesperson_SK INT NOT NULL 
CONSTRAINT DF_FactMyFact_SalesPersonSK DEFAULT 0

如果您不希望将默认值放入表中,只需创建列并允许 NULL 值,方法是选中设计页面上的框或发出以下命令:

ALTER TABLE FactMyFact
ADD Salesperson_SK INT NULL 

这个答案是根据我认为你的问题给出的:如果有帮助,请告诉我。

【讨论】:

哇,这正是我的问题。抱歉,我无法很好地解释它。您的第一个建议也是我的第一个想法,但我正在处理大约 2000 万行,因此每次添加新维度时重新加载所有数据可能不会在上线后奏效。您的其他建议是有道理的,但是在 SSIS 中加载数据时我还会遇到问题吗?如果每一行都有一个值 0,它会用实际的查找值覆盖它吗? 另外,截断事实表并用新列重新加载它是一种相当标准的做法吗?我一直在尝试解决这个问题,但没有看到任何解释在创建事实表后添加额外维度的最佳实践。 @BixShmix,您必须配置 SSIS 以检查列的更新,或者运行一次性手动更新语句来遍历并为每个已经存在的行分配一个值(read point #3)。我希望这仍在开发中,因此截断/重新加载会很容易。如果您有任何不可重新创建的数据(例如具有历史记录的 SCD2 列),则 truncate 不适用。 最坏情况下,您可以在 SalesPerson 维度中创建一个虚拟记录,其 ID 为 0,表示“未知” - 最好情况下,您可以配置 SSIS 包以检查更改并覆盖虚拟记录事实表中的数据 好的,这很棒。感谢您花时间回答。【参考方案2】:

与事实表的维度内连接,从维度中获取值并插入事实...

否则创建事实较少的事实方式

【讨论】:

以上是关于向数据仓库添加新维度(向事实表添加新列)的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库中每个事实的开始和结束期间

向 Azure 数据工厂中的表添加新列

数据仓库暗表中的选项维度信息

在迁移中向现有表添加新列

在 AWS Glue-ETL 中向目标表添加新列

数据仓库维度建模法案例