如何处理数据仓库中用户可以更改的代码表属性

Posted

技术标签:

【中文标题】如何处理数据仓库中用户可以更改的代码表属性【英文标题】:How to handle code table attribute in Data warehouse which user can change 【发布时间】:2014-08-14 15:37:47 【问题描述】:

我无法为我遇到的这个问题想出一个更好的标题,但我会尝试描述它:

我正在尝试从两个输入的 .csv 文件创建一个数据仓库,我在这个领域相当新。

我有一个包含 account_number、account_balance 和 account_code 列的输入文件。帐户有 account_code。 用户希望通过 account_code 和 code_group 查看余额。

Account_code 属于 code_group,account_code 和 code_group 之间的映射在单独的文件中。这种映射有一些规则,例如如果 account_code 的余额为正 account_code 属于一个 code_group,如果为负,则属于另一个 code_group。

我在放置 account_balance 的位置创建了事实表,在放置 account_number 的位置创建了 Account 维度表 和 account_code。

但是,我不知道如何处理这个 code_group。如果我想把它作为账户维度的一个属性,我想我必须通过account_code预先计算余额,并根据余额的符号将对应的code_group放入维度表中。

但是,用户希望能够更改 account_code 和 code_group 之间的映射,以便特定的 account_code 将属于另一个 code_group,并且他希望查看新映射和旧映射的报告。所以我想我将不得不根据这个变化来更新事实表和维度表,我有点困惑如何处理这个。

我应该把code_group属性放在账户维度,还是应该单独处理code_group?

感谢任何帮助。

编辑: 这是临时表:

account_number account_balance        account_code
-------------- ---------------------- ------------
100676         345.87                 1101
100829         200.15                 1101
100312         154.01                 3100

帐户代码属于一个 code_group。这是示例映射:

account_code code_group
------------ ------------------------------------------
1101         10 (if balance of the account_code is >=0)
1101         20 (if balance of the account_code is <0)
3100         20

用户可以随时手动更改此映射,以便明天看起来像这样:

account_code code_group
------------ ------------------------------------------
1101         30 
3100         20

另外,用户可以在 dwh 中导入新行,这会改变账户组的余额,也可以改变代码组,因为余额改变了。

这是所需报告的示例:

sum of account_balances account_code code_group
----------------------- ------------ -------------
546.02                  1101         10
154.01                  3100         20

这是事实表:

account_balance        account_key
---------------------- -----------
345.87                 1
200.15                 2
154.01                 3

这是 dimaccount 表:

account_number account_code account_key
-------------- ------------ -----------
100676         1101         1
100829         1101         2
100312         3100         3

而且我不知道将 account_code 和 code_group 的条件映射放在哪里。我应该将 code_group 放在其他维度或帐户维度中,还是应该将其放在一边,直到我必须计算报告?我现在更喜欢第三种选择,因为我认为这将是最简单的。因为如果我想把code_group放在account维度,我首先要计算所有account_code的余额,如果我这样做,明天它可能会改变......

【问题讨论】:

Vladimire,您的事实表中的确切度量是什么?账户余额,还是 balance_change?您的事实表是否具有每个 Account_code 的唯一性? Stevane,account_balance 是事实表中的度量。事实表对每个 account_number 具有唯一性,而不是 account_code,因为一个 account code 可以包含多个 account_number。我将编辑问题以说明问题。 【参考方案1】:

我会尽量不苛刻,但你的事实表不合适。其实有两种可能的情况:

    您不需要数据仓库,只需要一份报告 您需要它,但您缺少步骤,因为您在这里讨论的是预定义报告和/或仪表板的聚合表或快照视图。

这里有什么问题?

设计!事实表应该代表业务流程。在您的情况下,事实表只是 account_no 和 account_code 的自定义摘要报告。如果我理解错误,请纠正我,但是当您更新事实表时,您实际上会在需要的地方更改 account_balance 并在出现时插入新帐户。您应该通过 change_code 和 date 监控余额变化的业务流程。

事实:

change_code    account_code_key    change_date    changeAmount
--------------------------------------------------------------
123456         1                   2014-01-01     +380.00
123457         1                   2014-01-01     -220.00
123458         3                   2014-01-03     -45.67

使用此设计,您可以获得所有帐户的历史摘要。如果客户想知道他去年 12 月 1 日的余额是多少。或者他从 start_date 到 end_date 花了多少钱(只有减号)。

这个事实表需要两个维度表:时间维度和账户维度。

账户维度:

account_code_key    account_number    account_code    actual_code_group
-----------------------------------------------------------------------
1                   100676            1101            10 (sum of changes is positive)

当您没有定义日期字段时,很难理解您的意思是用户希望看到新旧映射。

在 dwh 中,所有条件字段都留给前端。在您的情况下,在打印(计算)报告时。有办法使用 SDC 类型 2 预先计算它,但我永远不会向你推荐它,因为以后计算它要容易得多。

【讨论】:

非常感谢您的回答,您真的让我对数据仓库大开眼界。无论如何我都会接受您的回答,但还有一个问题:由于您的事实表中有 account_code_key,因此有关特定 account_number 余额的信息会丢失,因此,如果您想跟踪它,您必须将 account_number_key 放入您的事实表而不是 account_code_key?然后,在生成报告时,您可以计算每个帐户代码的总和。 另一方面,我从用户那里得到的 account_no 和 account_code 的摘要报告完全足以制作用户要求我的报告。所以也许我根本不需要制作事实和维度表...... 第一条评论:是的,你可以。如果是一对多,你可以按 account_number 分组。或者我在这里交换了物品?一个 account_number 有一个或多个 account_code,对吧?是的,也许你在这里不需要雪花。但是,试一试,我建议从 Saiku 前端入手,你会喜欢的。模块化从那里开始:-) 感谢您的建议! :)

以上是关于如何处理数据仓库中用户可以更改的代码表属性的主要内容,如果未能解决你的问题,请参考以下文章

如何处理数据仓库设计中同样增长的事实/维度表?

如何处理数据仓库中重复id包含略有不同值的维度表?

大数据学习(三十一)数据仓库如何处理缓慢变化维

Jenkins一次任务构建中如何处理多个git仓库

如何处理具有相似属性的维度?

数据仓库事实表中的更新