【问题标题】:Update and delete records in the fact table更新和删除事实表中的记录
【发布时间】:2026-01-13 23:30:01
【问题描述】:

我有一个事实表,其中有五个与之关联的维度表。通常,事实表包含每个维度的代理键,并且没有业务/代理键。我正在尝试使用暂存事实表的数据加载事实表,即插入新记录。但是,我注意到事实表还可以处理其他操作,例如对数据的更新或删除。为此目的,在 SSIS 包中使用了条件拆分来检查所有代理键是否为 0,然后进行新插入。我的问题是,我可以在更新或删除方面使用代理键吗?

我在事实表上进行了插入,只是为了了解数据的外观。

【问题讨论】:

  • 如果您的事实表没有主键,那么识别要更新或删除的记录开始取决于运气。
  • 事实表中的主键不是必需的,可能没有用处。

标签: sql sql-server ssis fact


【解决方案1】:

答案是肯定的,你可以。但是,是否会出现一名员工在同一天从同一供应商向同一客户销售相同产品的情况?也许同一天有不同的订单? (这是基于您在问题中提供的数据)

如果所有代理键一起可以唯一标识一条记录,请将事实记录更新为您的心内容。但是,如果不是这种情况,您最终可能会在不打算更新时更新记录。

我倾向于在我设计的事实表中包含一个订单号以帮助避免这种情况,但您的实际事实表中可能没有这个。包括订单号是在事实表中引用degenerate dimension 的模式。我发现它非常方便。

不管怎样,答案都是一样的。您可以根据代理键更新事实记录,只要它们一起可以唯一标识您要更新的行。

不要大惊小怪,请确保您的数据仓库设计为您可以在需要时执行此操作。与删除和替换相比,能够就地更新事实会很好,因为 ETL 过程中的步骤可能会更少。

【讨论】:

  • 非常感谢您提供的信息丰富的回答。是的,我让 ETL 流程来处理每个维度的更新等。这已在暂存维度时创建,以防通过 OLDB 命令进行新条目或更新。然后,我从每个维度暂存了事实表,然后将每个维度加载为一个缓慢变化的基础,然后一旦修改记录就可以更新。
  • 听起来你已经考虑过了,很好。祝你好运!!
  • 我建了数据仓库,但是部署有问题!我试图通过询问错误类型的问题来通过该站点寻求帮助,但没有运气:_(
  • 当你发布它时我看了那个问题......版本太不同了,就像有人在cmets中所说的那样。尝试使用较新版本的 Visual Studio 或 BIDS 更新您的包。
  • 想象一下,我使用 2015 版本从头开始重新构建项目。当我尝试部署它时,它会抛出完全相同的错误!