2

我有一个电子商务网站,我想从它的关系数据库中创建一个数据仓库。考虑我的关系数据库中有一个付款表,每笔付款的状态都会在付款过程中发生变化(想象这些状态可能是:新建、处理中、成功、失败)。现在我想在我的仓库中有一个 PaymentFactTable,以便其中的每条记录都代表“在特定时间具有特定状态的所有付款”,然后在每个记录上我都有一些事实,例如总支付金额或总网关利息。但是我的问题出现了。想象一下,我的 ETL 服务已将一小时的付款转移并分组到我的仓库,但这些付款会在下一小时内改变它们的状态,所以......我该怎么办?以及我应该如何更新仓库中的付款组,一个问题是我没有' 在仓库中没有任何线索可以找到并更新更改付款的组。另一个问题是如何通知仓库这些状态变化以更新其数据?

4

2 回答 2

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 维度。

随着付款流经从新建到处理到成功/失败的流程,您将更新累积快照上的行以反映这一点。我包含这些Flag列是为了便于总结某些时间在某些状态下的付款。如果您也想适应它,您还可以添加一个CurrentStatusDim字段以连接到您的状态维度。如果您的 ETL 检测到您在接下来的一小时内从“新”移动到“成功/失败”,那么您知道它也在该小时内移动到“处理中”,但如果您不跟踪付款事件,您将不会能够知道它发生的具体时间。

于 2012-07-23T00:09:07.340 回答
0

我遇到过你的情况。这是我所做的,效果非常好:

我们决定在午夜“关闭书籍”当天,所有东西都按原样送到仓库。当天完成的任何事情都在仓库完成,并且从未在那里改变过。如果稍后发生退款或类似情况,这将被视为仓库的新交易。

这对会计部门很有效,因为这意味着永远不会“改写历史”,这是他们讨厌的。这对 IT 人员来说也很简单,因为我们每天只需要处理数据,而不必更新仓库数据(我们只需要每天插入)。

如果每天对您来说太粗略了,您可以改为使用每小时来执行此操作,但您可能会发现大多数企业都对每天感到满意。

如果数据量太大而无法每天处理,您可以预处理那些您知道在当天结束一天完成的交易(我们必须对午夜后的一些特别大量的交易执行此操作时间紧迫的报告要求)

于 2012-07-22T14:23:42.473 回答