2010-04-30 1 views
1

В настоящее время я создаю систему ETL для загрузки хранилища данных из транзакционной системы. Зерно моей таблицы фактов - это уровень транзакции. Чтобы я не загружал повторяющиеся строки, я поместил первичный ключ в таблицу фактов, который является идентификатором транзакции.Обработка дубликатов первичных ключей при загрузке хранилища данных

У меня возникла проблема с переводом транзакций. В транзакционной базе данных это делается через статус, который я набираю, и я могу работать, если транзакция выполняется или откат, чтобы я мог загрузить разворот на складе. Тем не менее, строка разворота будет иметь тот же идентификатор транзакции, и поэтому я получаю нарушение первичного ключа.

Я решил это сейчас, отрицая первичный ключ, поэтому идентификатор транзакции 1 будет оплатой, а идентификатор транзакции -1 (только на складе) будет отменой.

Я рассмотрел альтернативу генерации столбца BIT, где 0 является нормальным, а 1 - разворот, а затем делает PK идентификатором транзакции и столбцом BIT.

Мой вопрос в том, является ли это хорошей практикой, и кто-нибудь еще столкнулся с чем-либо подобным? Для справки, это система обработки платежей, поэтому значения не будут изменены, поэтому будут только транзакции и аннулирования.

ответ

4

В большинстве случаев таблица фактов имеет первичный ключ, который представляет собой совокупность нескольких FK. Таким образом, возможно, вы могли бы использовать комбинацию TransactionID и FK для dimTransactionType в качестве первичного ключа.

dimTransactionType будет выглядеть примерно так:

TransactionTypeKey integer 
TransactionTypeName varchar(20) 

и будет иметь

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

мастерить с битами и флагами не рекомендуется в DW - многословный как можно больше.

2

Общим подходом к созданию таблиц фактов является использование суррогатных ключей в качестве первичных ключей. Обычно достаточно большого целочисленного значения. Если идентификатор транзакции является внешним ключом для записи измерения, то он не должен использоваться в качестве первичного ключа в таблице фактов. Ваша логика суррогатного ключа (т. Е. Триггер для новой записи в таблице фактов) может основываться на комбинации идентификатора транзакции и типа транзакции.