数据仓库事实表问题
Posted
技术标签:
【中文标题】数据仓库事实表问题【英文标题】:Datawarehouse Fact table question 【发布时间】:2010-09-17 20:08:48 【问题描述】:我有一个名为 Loans 的事实表。在此表中的贷款标识符中,贷款日期和贷款金额。
在数据仓库中我不太清楚如何做的业务需求如下。未来可以调整贷款金额。假设 8 月 1 日,我们借了一笔 id 为 1 金额为 20,000 的贷款。 10月1日本次贷款调整为19000。我是否在事实表中放置了两个具有相同标识符、不同日期和金额的条目?
我是否创建一个新表(维度表),其中包含贷款金额和日期?处理这种情况的最佳方法是什么?
在生产数据库中,我们有一个总贷款金额表,然后是一个用于贷款金额的表格,因此贷款金额的组合等于总贷款金额。
【问题讨论】:
【参考方案1】:我始终建议将此类事实表视为完全可汇总的,对任何提升、付款、利息等进行有效的移动交易 - 如果您这样做,您可以绝对灵活地随着时间的推移进行报告,按交易类型等进行过滤- 在同一事实表中存储多个版本行或更新快照表,当您合并跨维度的不同指标时,可能还有其他报告选项,但在基本级别,通常逐行逐项列出这些事件。
M
【讨论】:
【参考方案2】:将 LoanID 视为退化维度并单独输入更正。 您还可以使用交易类型维度来描述:贷款、付款、更正等。
DateKey CustomerKey TransacionTypeKey LoanID Amount
---------------------------------------------------------
20100801 175 1 1 20000.00
20101001 175 2 1 - 1000.00
按客户,按贷款显示所有贷款
select
CustomerKey
, LoanID
, sum(Amount) as Amt
from factLoan
group by CustomerKey, LoanID
order by CustomerKey, LoanID ;
【讨论】:
【参考方案3】:这称为渐变维度,它取决于业务需求、天气与否,您是否希望跟踪该行中发生的更改。 通常有 3 种类型的渐变维度。
在类型 1 渐变维度中,新信息只是简单地覆盖了原始信息。换句话说,不保留任何历史记录。
在类型 2 渐变维度中,将新记录添加到表中以表示新信息。因此,原始记录和新记录都将存在。新记录有自己的主键。
在类型 3 渐变维度中,将有两列表示感兴趣的特定属性,一列表示原始值,一列表示当前值。还会有一列指示当前值何时变为活动状态。
您可以参考 kimball 手册,了解有关渐变尺寸的更多信息。
【讨论】:
【参考方案4】:您是否真的需要多个版本取决于要求。您是否只需要按原样报告贷款金额,还是还需要按原样了解情况?如果您不确定,那么保留历史记录(多个版本)可能是有意义的。我的假设是保留历史记录。
我建议为每个新版本和日期列创建新行以表示版本适用的日期。
【讨论】:
我需要知道贷款金额的原样和原样。但我还需要能够说明是否有一笔贷款有两次贷款金额调整,即 1 笔贷款用于计数目的。因此,我正在考虑为贷款制作一个事实表,并为逐项贷款金额制作一个子表。这有意义吗?【参考方案5】:正如您所说,贷款是事实。贷款可以调整,即贷款金额可以增加或减少。一般有两种处理方法:
在事实中插入一个带有增量的新行。在这现在有两行贷款。这意味着 Loan 事实的主键不能单独是 Loan ID。它具有(逻辑上,不一定是物理上)加载 ID 和日期,或贷款 ID 和条目号(日期作为另一个属性)。结果会如你所说。我会将 TransactionTypeKey 更改为 TransactionTypeCode,这样命名更正确。
使用新余额更新事实。在这种情况下,最终结果将被存储,但更改会丢失。主键是LoanID;日期是一个属性。
大多数其他应用程序,例如订单处理,将使用第一个解决方案,这是我认为您需要的。解决方案 1 的优点还在于它是完全可加的。
关于 Saad El Oualji 的评论,这根本不是 SCD 案例,而是详细的事实设计。他对 SCD 的描述是正确的,但 SCD 描述的是维度变化,而不是事实变化。
【讨论】:
以上是关于数据仓库事实表问题的主要内容,如果未能解决你的问题,请参考以下文章