代码之家  ›  专栏  ›  技术社区  ›  Meff

在数据仓库加载中处理主键重复项

  •  1
  • Meff  · 技术社区  · 14 年前

    我目前正在构建一个etl系统来从事务系统加载数据仓库。事实表的核心是事务级别。为了确保不加载重复的行,我在事实表上放置了一个主键,即事务id。

    我遇到了一个事务被撤销的问题-在事务数据库中,这是通过一个状态完成的,我可以选择该状态并计算出事务是否正在完成,或者回滚,以便在仓库中加载撤销行。但是,撤销行将具有相同的事务ID,因此我得到一个主键冲突。

    我现在通过否定主键解决了这个问题,所以事务ID 1将是一个付款,事务ID-1(仅在仓库中)将是反转。

    我考虑了另一种方法,生成一个位列,其中0是正常的,1是反转的,然后使pk成为事务id和位列。

    我的问题是,这是一个很好的做法,还有其他人遇到过这样的事情吗?作为参考,这是一个支付处理系统,所以值不会被修改,所以只有交易和冲销。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Damir Sudarevic    14 年前

    在大多数情况下,事实表有一个主键,它是多个FK的组合。所以,也许您可以使用transactionid和fk的组合来 dimTransactionType 作为主键。

    这个 DimTransactionType 看起来像是:

    TransactionTypeKey  integer
    TransactionTypeName  varchar(20)
    

    而且会

    0, 'unknown'
    1, 'normal'
    2, 'reversal'
    

    在dw中不建议修改位和标志——尽可能详细。

        2
  •  2
  •   jamz    14 年前

    设计事实表的一种常见方法是使用代理键作为主键。一个大的整数值通常就足够了。如果事务ID是维度记录的外键,则不应将其用作事实表中的主键。代理项密钥逻辑(即事实表中新记录的触发器)可以基于事务ID和事务类型的组合。