У меня есть два набора таблиц в двух отдельных базах данных, A
и B
. В каждой базе данных есть две таблицы, которые мне нужны, Fruits
и FruitRecipes
. (Причина, по которой у нас есть две базы данных, заключается в том, что они представляют отношения отработки отказа - если одна выходит из строя, другая пробуждается и продолжает накапливать записи.)
Fruits
:
+---------+----------+-----+----------+
| FruitId | Name | ... | Datetime |
+---------+----------+-----+----------+
| 1 | "Apple" | ... |<datetime>|
| 2 | "Orange" | ... |<datetime>|
| 3 | "Banana" | ... |<datetime>|
+---------+----------+-----+----------+
FruitRecipes
:
+---------------+----------+---------+
| FruitRecipeId | RecipeId | FruitId |
+---------------+----------+---------+
| 1 | 2 | 1 |
| 2 | 3 | 2 |
| 3 | 1 | 3 |
+---------------+----------+---------+
Fruits
относится к FruitRecipes
первичного ключа Fruits
FruitId
. Эти таблицы являются частью большего отношения «многие ко многим» между Fruits
и Recipes
, где FruitRecipes
- это таблица соединений между ними, но меня не касается Recipes
, так как эта таблица обновляется редко и поддерживается вручную.
Эти таблицы имеют идентичные структуры как для A
, так и B
, но содержащиеся в них данные не пересекаются между ними, за одним важным исключением: первичный ключ в Fruit
(FruitId
) может дублироваться между ними. Например, A.Fruit
может иметь запись (1, "Apple", ... , "4.13.2020:11:42")
, но B.Fruit
может иметь (1, "Kiwi, ... , "6.18.2019:3:26")
.
Моя задача - еженедельно архивировать данные из A.Fruits
и B.Fruits
в один Archive.Fruits
и архивировать A.FruitRecipes
и B.FruitRecipes
в один Archive.FruitRecipes
. При необходимости мы можем однозначно идентифицировать строку в Fruits
на основе Name
и Datetime
- из-за характера наших данных очень маловероятно, что две такие идентичные записи когда-либо будут существовать, и если они существуют, мы только позаботьтесь о сохранении одного из них.
Я не уверен, как go объединить эти два набора таблиц в один набор таблиц без дублирования первичных ключей в Archive.Fruits
. Клавиши в A
могут появляться в B
или Archive
, а клавиши в B
могут появляться в A
или Archive
. Archive
само по себе не имеет дубликатов. Если бы FruitRecipes
не существовало, я бы заархивировал Fruits
без FruitId
и просто назначил бы новые первичные ключи в порядке Datetime
- это на самом деле не имеет значения. Однако из-за необходимости поддерживать отношения Fruit
- FruitRecipe
необходимо каким-то образом обновить FruitId
в Fruits
и FruitRecipes
до нового уникального идентификатора в базе данных Archive
.
У меня есть один набор промежуточных таблиц, настроенных в моей базе данных Archive
, но я даже не могу поместить туда данные, не решив сначала проблему с первичным ключом.
Я использую SQL Сервер для хранения и пакеты служб SSIS для управления потоком данных.