2010-04-30 95 views
1

我目前正在構建ETL系統以從事務性系統加載數據倉庫。我的事實表的顆粒是交易級別。爲了確保我不加載重複行,我在事實表上放置了一個主鍵,這是事務ID。處理數據倉庫加載中的主鍵重複

我遇到了一個交易被顛倒的問題 - 在交易數據庫中,這是通過一個狀態來完成的,我可以在這個狀態下完成交易,或者回滾,這樣我就可以加載一個倉庫中的反轉行。但是,反轉行將具有相同的事務ID,因此我得到主鍵違規。

我已經通過否定主鍵解決了這個問題,因此事務ID 1將是付款,並且事務ID -1(僅在倉庫中)將是逆轉。

我已經考慮過生成BIT列的替代方案,其中0是正常的,1是逆轉,然後使PK成爲交易ID和BIT列。

我的問題是,這是一個很好的做法,並有任何其他人遇到過這樣的事情嗎?作爲參考,這是一個支付處理系統,所以價值不會被修改,所以只會有交易和逆轉。

回答

4

在大多數情況下,事實表有一個由多個FK組成的主鍵。所以,也許你可以使用TransactionID和FK的組合作爲dimTransactionType作爲主鍵。

dimTransactionType看起來是這樣的:

TransactionTypeKey integer 
TransactionTypeName varchar(20) 

而且會對

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

與位和標誌修修補補在DW不推薦 - 詳細儘可能。

2

設計事實表的常用方法是使用代理鍵作爲主鍵。一個大的整數值通常就足夠了。如果事務ID是維記錄的外鍵,則不應將其用作事實表中的主鍵。您的代理鍵邏輯(即觸發事實表中的新記錄)可以基於事務標識和事務類型的組合。