是否建议将事实表处理为SCD类型2?

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

背景

我们是一家专门为网店提供当日送达服务的快递公司。客户在网上商店订购时可以选择当日送达,网上商店将这些包裹登记在我们的系统中,并在某个截止时间,我们取走这些包裹并在晚上晚些时候递送。

我认为我们的情况很常见:在过去的几年里,公司一直在收集大量数据。这些数据仅位于操作数据库中,并且每隔一段时间就会进行 Excel 导出并将其发送给自由职业者以在 Power BI 中创建报告。因此,我们的管理层希望开始为我们的司机使用自动每日报告和记分卡,我的任务是解决这个问题。我的计划是使用 MS SQL Server、SSMS、SSIS 和 Power BI 构建一个数据仓库(也许使用 Stitch 和 Dataform 进行 ETL 和建模来取代 SSIS)

问题

我的老板想知道一天结束时几种状态的数量是多少。但现在这是不可能的,因为当状态发生变化时,整行都会被覆盖。货件会经历 6 种状态,并且由于我们会在同一天(或实际上在 8 小时内)取货并交付货件,因此货件会在一天内经历所有状态。这也意味着发货日期始终与交货日期相同。

例如:如果我们在 2019-11-25 发货了 100 个包裹,其中 10 个包裹未能投递,那么这 10 个包裹将收到“投递失败”状态,并会在第二天再次发送,所以 2019-11- 26.然而,凌晨 4 点之后,未能送达的货件状态将重置为“已入库”。这意味着,当我在 2019 年 11 月 26 日凌晨 4 点之前向数据仓库填充这 100 个包裹时,我将在 2019 年 11 月 25 日收到 100 批货件,其中 90 件已交付,10 件未能交付,这是正确的。

现在假设在 2019 年 11 月 26 日,之前未能投递的 10 个包裹现已成功投递,并且我在 2019 年 11 月 27 日凌晨 4 点之前运行了 ETL 流程,那么数据仓库将不再包含之前投递的 10 个包裹。 2019年11月25日未能交付。相反,它只会说 2019-11-25 已发货并交付 90 批货物,2019-11-26 已交付 10 批货物,而不是 2019-11-25 已发货 100 批,其中 90 批已交付,10 批未能交付。这是因为这 10 批货件已被覆盖为“已送达”状态。

所以我的想法是将事实表视为 SCD 2 来跟踪发货状态以及交货日期。每个shipment_id代表一次发货和一个包裹(箱),因为我们不会在一次发货中发送多个包裹。这意味着通过shipping_id 的计数可以得出我们已完成的发货量。使用 SCD 2,仍然可以通过不同的计数来实现,因此报告仍然会显示单日的正确发货量。

另一个解决方案(我认为)是对所有状态进行计数,并将每天的状态保存在数据仓库中的单独表中。就像定期快照事实表一样。

你们对这种通过将 SCD2 应用于事实表以显示每天结束时某些状态的数量来跟踪货件状态的方法有何看法?

sql-server business-intelligence dimensional-modeling star-schema fact
1个回答
0
投票

当状态改变时,整行被覆盖

那么我不会将此表视为事实表。看起来像SCD1。

所以我的想法是将事实表视为SCD 2

如果 SCD 2 意味着只是为每次交付尝试添加一个新行,那么您应该首先完成此操作。

但是,如果您所说的 SCD2 指的是成熟的维度,那么我建议如下:

Fact
Dimension
实际上是表在特定查询中的角色。如果一个表同时满足两者的要求,它就可以在不同的查询中扮演这两种角色(或者,在显式模型中,在不同的星中)。

假设没有属性,也没有其他度量,事实表与SCD2的区别在于:

  • 事实表应该有一个到周期维度(日期)的链接
  • SCD2 应该有开始和结束日期
  • SCD2 应该有一个代理键

因此,我只会具体化其中一个并在视图中计算另一个。

如果您在数据仓库中使用哈希而不是序列作为代理键,那么我将具体化事实表。 例如,您可以拥有一个包含以下列的交易事实表:

发货 日期 状态

和SCD2的视图一样

SELECT
  MD5(shipment | date) AS shipment_hash,
  shipment,
  date AS start_date,
  LEAD(date - 1, 1, DATE '9999-12-31') OVER (PARTITON BY shipment ORDER BY date) AS end_date,
  status
FROM transaction_fact

SQL Server 可以计算索引上的 LEAD,因此这种视图非常便宜。 它还简化了 ETL,因为无需更新

end_date
列。

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