【问题标题】:Handling primary key duplicates in a data warehouse load处理数据仓库负载中的主键重复
【发布时间】:2010-04-30 15:55:16
【问题描述】:

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

我遇到了事务被撤消的问题 - 在事务数据库中,这是通过状态完成的,我可以获取该状态,我可以确定事务是否正在完成,或者回滚以便我可以加载撤消排在仓库里。但是,反转行将具有相同的事务 ID,因此我得到主键违规。

我现在通过否定主键解决了这个问题,所以交易 ID 1 将是付款,而交易 ID -1(仅限仓库)将是撤销。

我考虑过生成 BIT 列的替代方法,其中 0 表示正常,1 表示反转,然后将 PK 设为事务 ID 和 BIT 列。

我的问题是,这是一个好习惯吗?还有其他人遇到过这样的事情吗?作为参考,这是一个支付处理系统,因此不会修改值,因此只会有交易和撤销。

【问题讨论】:

    标签: ssis data-warehouse etl


    【解决方案1】:

    在大多数情况下,事实表具有一个由多个 FK 组合而成的主键。因此,也许您可​​以使用 TransactionID 和 dimTransactionType 的 FK 的组合作为主键。

    dimTransactionType 看起来像:

    TransactionTypeKey  integer
    TransactionTypeName  varchar(20)
    

    并且会

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 2018-06-05
        • 1970-01-01
        • 2012-12-04
        • 2016-05-07
        相关资源
        最近更新 更多