数据仓库事实表中的更新

Posted

技术标签:

【中文标题】数据仓库事实表中的更新【英文标题】:Update in data warehouse fact table 【发布时间】:2019-06-27 14:07:53 【问题描述】:

阅读了有关事实表(事务、累积、定期)等的许多 Kimball 设计技巧。我仍然不清楚我应该如何处理我认为并不少见的更新事实表的情况。到案子。

我们正在处理来自客户的投诉,我们希望能够在数据仓库中反映投诉的当前状态。我们的投诉有一个他们经历的状态工作流程,不同的受让人按时处理他们,但对于我们的分析来说,这与现在无关。我们想回顾一下目前的投诉情况。

据我了解,事实表的粒度将是单一投诉,带有列(与此问题无关,是否应该是垃圾维度、退化等),例如:

投诉号码 当前状态 当前状态日期 当前受让人 投诉类型

据我了解,由于我们不想查看进程历史记录,而是查看进程的当前状态,因此为每个表示其状态的投诉存储多行是一种矫枉过正的做法,因此我们存储每个投诉只有一行,然后更新

现在,我的推理正确吗?在上述情况下,投诉数量和投诉类型存储值不会更改,而“当前”列会更改,我们需要更新行,因此我们可以实现更改数据捕获机制(就像我们现在对维度所做的那样)将来自该事实的源系统的传入行与当前存储的事实行进行比较,以降低此类操作的时间成本。

老实说,对我来说,它看起来像一个混合 SCD 类型 0 和 1 的维度表,但它存储了接收投诉的事实。

发帖供参考:Fact table with information that is regularly updatable in source system

编辑

我知道我可以使用带有时间戳的累积事实表,这有点类似于 SCD 类型 2,但最终用户并不真正关心该过程的历史。稍后在分析中涉及更多事实,因此在这种情况下,将这种需求与数据仓库分开并不起作用。

【问题讨论】:

【参考方案1】:

我过去遇到过类似的用例,其中累积快照将是默认解决方案。

但是,累积快照不允许具有不同长度的进程。我设计了一种不同的模式,为每个事件添加 2 行:如果一个对象从状态 A 转到状态 B,您首先插入状态 A 和数量 -1 的行,然后插入状态 B 和数量 + 的新行1.

最终结果允许: - 无需更新,只需插入; - 地图减少友好; - 任意长度的进程; - 在任何时间点计算每个状态中每个状态的数量(出于性能原因,借助定期快照); - 在任何时间点有多少人进入或离开任何状态。 - 计算每个州的时间和总体年龄。

这里有 5 篇博文的详细信息(在 Pentaho 数据集成中实现):

http://ubiquis.co.uk/dwh/status-change-fact-table-part-1-the-problem/

【讨论】:

感谢您的帖子,我相信您的看法是对 Kimball 提出的使事务事实表 SCD2 相似的方法的修改:kimballgroup.com/2012/05/… 我也考虑过这一点,但不想过分收集历史,因为最终用户似乎真的不关心这个过程,但我觉得很不幸。 是的,但不完全是。无需考虑更新,更轻松地提供净计数。

以上是关于数据仓库事实表中的更新的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库之三大事实表

数据仓库星型模式的维度表和事实表中的数据如何?

使用触发器链接到数据仓库中事实表中的时间维度是个好主意吗?

数据仓库中事实表的复合索引 - 数据集市

Hadoop之数据仓库设计

Hadoop之数据仓库设计