我有一个电子商务网站,我想从其关系数据库中创建一个数据仓库。考虑我的关系数据库中有一个支付表,每个支付的状态都会在支付过程中发生变化(想象一下这些状态可能是:新建,处理,成功,失败)。现在我希望在我的仓库中有一个PaymentFactTable,以便其中的每条记录代表“具有特定状态的特定小时内的所有付款”,然后在每个我都有一些事实,如总付款金额或总门户兴趣。但是我的问题就出现了。想象一下,我的ETL服务已将一小时的付款转移并分组到我的仓库中,但这些付款会在下一个小时内改变其状态,所以......我该怎么办?我应该如何更新仓库中的支付组,一个问题是我在仓库中没有任何线索来查找和更新已更改的支付组。另一个问题是如何通知仓库这些状态变化以更新其数据?
答案 0 :(得分:1)
您正在此处跟踪流程。在维度数据模型中,Ralph Kimball建议,为此,您应该使用所谓的“累积快照”事实表。
基本上,这是表格的示例:
PaymentAccFactID Int
PaymentNaturalKey Int (the "natural identifier" of a transaction)
CustomerDim Int
PaymentTypeDim Int
... additional dims as needed ...
NewStatusTS Timestamp (ansi timestamp)
NewStatusHourDim Int
NewStatusFlag SmallInt
ProcessingStatusTS Timestamp
ProcessingStatusHourDim Int
ProcessingStatusFlag SmallInt
SucceededStatusTS Timestamp
SucceededStatusHourDim Int
SucceededStatusFlag SmallInt
FailedStatusTS Timestamp
FailedStatusHourDim Int
FailedStatusFlag SmallInt
每次拉动ETL时,拉出自上次拉动以来已更改的所有记录,并相应地修改状态。 HourDim
字段将连接到您的Day by Hour维度 - 或者您可以创建第二组字段以挂钩每个状态的Day(日期)维度,而第一个字段仅指向您的Time of Day维度。
当付款流经从New到Processing到Succeeded / Failed的过程时,您将更新累积快照上的行以反映这一点。我添加了Flag
列,以便在特定时间轻松汇总特定状态的付款。您还可以添加CurrentStatusDim
字段以连接到您的状态维度,如果您想要也适合它。如果您的ETL在下一个小时内检测到您已从New更改为Succeeded / Failed,那么您知道它在该小时内也已移至“正在处理”,但如果您未跟踪付款事件,则不会能够知道它发生的具体时间。
答案 1 :(得分:0)
我一直在你的情况。这就是我所做的,而且效果非常好:
我们决定在当天午夜“书籍已关闭”,所有内容都按原样发送到仓库。无论当天完成什么,都在仓库完成,并且从未改变过。如果退款或类似事件发生在以后,那将被视为仓库的新交易。
这适用于会计部门,因为它意味着从不“重写历史”,他们讨厌。这对IT人员来说也很简单,因为我们每天只需要处理数据,而且不必更新仓库数据(我们每天只插入)。
如果每天对你来说过于粗略,你可以用小时来做,但你可能会发现大多数企业都很满意。
如果数据的大小太大而无法每天执行,那么您可以预先处理那些当天结束之前的最终交易(我们必须对某些特定的事情进行处理)大量交易,具有午后时间关键报告要求)