Я выполняю 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
.
Это хорошая идея, или есть лучший способ.
Спасибо!