Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Обработка дубликатов первичного ключа при загрузке хранилища данных

Автор вопроса: MeffОтветов: 2

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

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

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

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

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

data-warehousessisetl

Ответы

Ответ 1 · рейтинг 4 · Damir Sudarevic

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

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

TransactionTypeKey  integer
TransactionTypeName  varchar(20)

и было бы

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

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

Ответ 2 · рейтинг 2 · jamz

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы