Как архивировать связанные данные (в разных таблицах), используя SSIS - PullRequest
2 голосов
/ 01 марта 2011

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

Мне нужно найти эффективное и простое в обслуживании решение в SSIS.Я могу придумать как минимум три способа сделать это:

  1. написать большой оператор выбора с большим количеством левых объединений, чтобы получить все нужные мне данные, а затем просмотреть эти данные либо в памяти, либо в хранилище.он в промежуточной таблице
  2. работает по принципу «таблица за таблицей», выбирая задания, затем связанные данные из других таблиц
  3. аналогично первому способу, за исключением того, что просто выдает данные вНормализованная таблица (кажется, ленивый метод?)

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

Я ищу оптимальный подход, у кого-нибудь есть другой подход?Как бы другие люди достигли этого?

Ответы [ 3 ]

6 голосов
/ 15 марта 2011

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

Для архивирования данных:

  • Сначала пройдите и, используя свои бизнес-правила, определите данные, которые необходимо заархивировать. В целом это означает создание временной таблицы (или набора данных), содержащей только ключи данных, подлежащих архивированию. Используя в качестве примера счета-фактуры, я собираю только идентификаторы счетов-фактур, которые необходимо архивировать, и этого должно быть достаточно для идентификации всех связанных дочерних данных (позиций счетов-фактур, информации о доставке и оплате и т. Д. И т. Д.). Вам может понадобиться несколько таких наборов, например, для архивирования как счетов, клиентов, так и продавцов, поскольку ни один из них «полностью не содержится» в другом.
  • Убедитесь, что эти наборы являются целыми и завершенными (то есть они не содержат разорванных родительских / дочерних отношений). Основываясь на всей последующей работе с этими наборами данных, вы убедитесь, что ничего лишнего случайно не «проскальзывает».
  • Затем, пройдите и скопируйте данные, идентифицированные в этих наборах, из исходной базы данных в базу данных архива.
  • Когда все данные будут правильно скопированы (и только потом), вернитесь назад и удалите эти данные из исходных таблиц.

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

  • Можно ли изменить данные в случае перезагрузки? Если это так, то вам, вероятно, потребуется удалить его из архива, поскольку, когда он в конечном итоге будет переархивирован, возможно, он был изменен. Это или вам придется разрешить архивирование одного и того же набора данных дважды!
  • Вероятно, вы захотите пометить повторно загруженные данные, чтобы они не были немедленно повторно архивированы при следующем запуске архива.

Эта методология будет работать независимо от инструмента - SSIS или иным образом.

0 голосов
/ 29 февраля 2016

Используйте CQRS.Проблема в термине «связанные данные».Если вы разделите свои чтения (все возможные чтения в собственной базе данных / таблицах), у вас не будет необходимости в связанных данных, и вы сможете применять правила к каждому «Агрегированию» отдельно при необходимости.Допустим, для представлений в виде списка вы получаете счет из двух разных источников (фактических и архивных данных) при рендеринге пейджера.Для подробного просмотра у вас все еще могут быть UUID для каждого ресурса, но в этом случае приложение будет читать из разных хранилищ данных.Ключевым моментом здесь является избавление от всех видов объединений.

0 голосов
/ 02 марта 2011

Не могли бы вы быть более конкретным?

Вам нужны «старые» данные, все еще присутствующие в вашей текущей базе данных? Если да - тогда вы можете просто:

  1. Резервное копирование и восстановление
  2. списать один 'эффективный' удалить
  3. Создание нового пакета служб SSIS, который будет поддерживать заполнение данных в будущем / поддерживать

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


если это поможет, пометьте как ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...