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

时间:2014-08-14 15:37:47

标签: database-design data-warehouse

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

我正在尝试用两个输入.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_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_code余额,如果我这样做,明天就可以改变......

1 个答案:

答案 0 :(得分:2)

我会尽量不要苛刻,但你的事实表并不好。实际上,有两种可能的情况:

  1. 您不需要数据仓库,只需要报告
  2. 您需要它,但是您缺少步骤,因为这里您正在讨论预定义报告和/或仪表板的聚合表或快照视图。
  3. 这里有什么问题?

    设计!事实表应代表业务流程。在您的情况下,事实表只是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预先计算它,但我永远不会建议你,因为以后计算它会容易得多。