【问题标题】:Point-in-time snapshots in data warehouse数据仓库中的时间点快照
【发布时间】:2013-04-07 20:20:25
【问题描述】:

我正在尝试在确切的时间点重新创建客户的状态。例如,每个客户都有许多可以随时更改的属性(例如,风险评分、最新账单、客户满意度)。

每次客户提交信用申请时,我都希望在提交时查看所有这些特征的价值。随后,我想使用这些值来开发预测模型。

我的第一个想法是创建一个带有有效和到期日期/时间戳的 Type-2 缓变维度,并使用半开连接 time_effective

但是,这些属性中的大多数都是行为维度,需要使用事实表中的历史数据进行复杂的计算。此外,计算值也不能使用范围(0-500 美元、500-750 美元等)进行分组。跟踪每个维度的所有这些属性会导致它爆炸。注意:有些值每天都在变化,有些则在任意时间点变化。

我理想的数据提取如下:

  • 信用申请ID#
  • 提交时间
  • 提交时属性 1 的值
  • 属性 2 的值...
  • 属性 N 的值

除了信用申请之外,还有其他事实表,我想在其中找到在该事件发生时有效的特征。

有什么建议来处理这个问题?我看到了几种方法:

  1. 允许维度爆炸
  2. 创建具有一个或多个属性的单独表,并分别查询具有我感兴趣的属性的特定表
  3. 在信用申请事实表中追加一列,其中包含我感兴趣的所有属性的“快照”。

其中一些问题在 Kimball 的 ETL 工具包书籍 (pp 190-192) 和他的数据仓库工具包书籍 (187-191) 中进行了讨论。在第 154-157 页,有一个关于“快速变化的怪物维度”的讨论,这似乎非常相关。不过,我在执行这些建议时遇到了麻烦。

【问题讨论】:

  • 我真的很喜欢#3。将这些属性视为专门与该应用程序相关的“退化维度”,而不是客户的一般属性。我不确定这个问题是否会在 SO 上得到一个很好的答案,因为它实际上取决于您的最终游戏用例以及您的 DBMS 的强大程度。 DW 应用程序可能会在一段时间内处理 #1(尽管如果您为每个客户存储每日风险评分,它真的会爆炸)...
  • 如果源系统(在 OLTP 期间)在事务发生时无法记录值,#3 是否仍然是一个不错的选择?换句话说,它必须在构建事实表时在后处理 ETL 期间添加。你对#2有什么想法吗?这样做的一个可能好处是您可以潜在地以模块化方式构建属性。
  • 如果源系统在申请时没有跟踪属性,那么是的,它必须在 ETL 期间添加。 #2 基本上只是为有趣的属性创建一个“独立”的 SCD 表或一组表。在任何情况下,无论您采用哪种方式,无论该快照是对 SCD 的更新还是将数据添加到事实表,您都将在 ETL 过程中生成数据“快照”......

标签: database database-design data-warehouse etl


【解决方案1】:

我将创建单独的应用程序事实表,其中包含相关表和相关记录的键。假设您有以下维度和事实表:

  • (D) 申请
  • (D) 申请人(或客户)
  • (D) 产品
  • (D) 时间
  • (D)monthly_scoring_fact(每月行为评分)
  • (F)monthly_satisfaction_fact(每月满意度调查)
  • (F) 满意度评估事实(临时满意度评估)

那么就可以创建如下事实表Application Fact:

  • application_key - 指向应用维度
  • applicant_key - 指向申请人维度
  • product_key - 指向产品维度
  • time_key - 指向时间维度
  • monthly_scoring_fact_key - 指向每月评分的最后结果
  • monthly_satisfaction_fact_key - 指向最后的满意度数据
  • satisfaction_evaluation_fact_key - 指向最后的临时评估数据

使用这种方法,您可以获得时间一致的数据并将应用程序维度保持在 SCD0 中(仅更正)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多