Как мне go переназначить первичные ключи при архивировании двух идентичных наборов таблиц в один набор? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть два набора таблиц в двух отдельных базах данных, 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 для управления потоком данных.

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