SSIS ETL Transform-Load Как справиться с созданием/обновлением (т.е. UPSERT) для данных таблицы внешнего ключа?

Я выполняю ETL для набора таблиц Office, Employee, Location, следуя стандартной практике переноса всех данных в промежуточные таблицы, сначала с помощью пакетов Extract, а затем выполняя Transform- Загрузите в каждую из промежуточных таблиц, чтобы получить данные в соответствующие таблицы.

В каждом из моих пакетов Transform-Load SSIS я выполняю CUD (Создание, обновление, удаление) с использованием MERGE JOIN и CONDITIONAL разделения.

Это прекрасно работает, когда данные в промежуточной таблице соответствуют 1-к-1 соответствующей реальной таблице. В приведенном ниже сценарии (см. изображение) таблица SampleLocation соответствует таблице StageSampleLocation один к одному.

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

Объяснение проблемы

Если вы посмотрите на следующую диаграмму базы данных...

введите здесь описание изображения

Данные из StageSampleOffice переходят в SampleOffice для полей, содержащих данные Office. В дополнение к офисным данным в StageSampleOffice есть данные о человеке — в этом примере поле OfficeManagerName нужно будет искать в таблице FK SamplePerson. Если имя не существует в таблице SamplePerson, это имя необходимо будет сначала вставить в SamplePerson, а значение PersonId PK для этого человека будет извлечено и сохранено как значение FK в строке для импортированного офиса в таблице SampleOffice. , в моей задаче потока данных.

Точно так же для информации об адресе в StageSampleOffice детали нужно будет искать в таблице SampleLocation FK, и если адрес не существует, необходимо вставить новый с соответствующими значениями из StageSampleOffice. Как только это будет сделано, LocationId для адреса будет сохранено как FK в таблице SampleOffice.

Как видите, данные для SampleLocation и SamplePerson могут поступать в систему из 2 и более источников. В приведенном выше примере для SampleLocation я получаю файл данных о местоположении, который содержит только адреса. Я также получаю адреса как часть записей Office от различных типов офисов, которые входят в таблицу StageSampleOffice.

Что я пробовал до сих пор

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

Я думаю, что

  • для данных Person, которые присутствуют в StageSampleOffice, я сначала вставлю данные в таблицу StageSamplePerson (не показана на диаграмме), а затем выполню пакет Transform-Load для SamplePerson, который выполнит создание или обновление для этих лиц и
  • для данных о местоположении, которые присутствуют в StageSampleOffice, я сначала вставлю данные в таблицу StageSampleLocation (не показана на диаграмме), а затем выполню пакет Transform-Load для SampleLocation, который выполнит создание или обновление для тех Местоположение.

Таким образом, все строки FK будут присутствовать в соответствующей таблице, когда поток вернется к моему основному пакету, который выполняет преобразование-загрузку для таблицы SampleOffice.

Это хорошая идея, или есть лучший способ.

Спасибо!


person Shiva    schedule 30.12.2015    source источник
comment
ваш ssis будет иметь 1) выполнить задачу sql для усечения таблицы этапов 2) задачу потока данных для загрузки всех данных в таблицу этапов 3) выполнить задачу sql для вызова хранимой процедуры, которая выполняет ваши операции CUD (создайте хранимую процедуру для этого)   -  person techspider    schedule 31.12.2015
comment
У меня это уже есть. Вы полностью прочитали мой вопрос??   -  person Shiva    schedule 31.12.2015


Ответы (1)


Мне кажется, что "6 одного, полдюжины другого".

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

Независимо от того, «предварительно уплотняете» их в промежуточных таблицах или нет, рабочая нагрузка будет одинаковой. Я бы выбрал подход, который кажется вам более интуитивным, потому что это будет тот, который вы найдете более удобным для сопровождения в будущем.

person Tab Alleman    schedule 31.12.2015