Рефакторинг SQL - уникальные имена для уникальных идентификаторов - PullRequest
0 голосов
/ 16 июля 2009

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

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

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

Теперь также представьте, что у меня есть таблица Задач, где каждая Задача состоит из имени, Вехи, Категории, Навыка и PayRate, и каждая из них выбирается из соответствующих таблиц. По старой схеме в этой таблице хранятся только имена. В новой схеме в этой таблице будут храниться идентификаторы четырех таблиц, а не имена, как показано ниже:

TaskID  TaskName  MilestoneID  CategoryID  SkillID  RateID

где TaskID - это сгенерированный уникальный идентификатор для этой задачи.

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

Мой вопрос: каков самый простой запрос для перемещения данных из старой схемы в новую?

Это делается для поддержки хранения двух отдельных списков Вех, Задач и т. Д. В одной базе данных.

1 Ответ

3 голосов
/ 16 июля 2009

Я бы сделал следующее

  • Шаг ноль: резервное копирование базы данных

  • Шаг первый: Добавьте уникальные идентификаторы в Вехи, Категории, Навыки и PayRates. Это простое добавление столбца со значением по умолчанию следующий идентификатор. Это сгенерирует ваши идентификаторы для существующих имен.

  • Шаг второй: Добавьте четыре новых столбца в существующую таблицу задач (и добавьте внешние ключи в исходные таблицы, если необходимо), не удаляя старые столбцы с указанием имени.

  • Шаг третий: Выполнить (при условии, что старые столбцы с указанием имен называются Milestone, Skill и т. Д.)

      update Tasks set MilestoneID = (
                                      select MilestoneID from Milestones where 
                                      Milestone = Tasks.Milestone
                                     ), 
                       CategoryID = (
                                      select CategoryID from Categories where 
                                      Category = Tasks.Category
                                    ),
                       SkillID = (
                                      select SkillID from Skills where 
                                      Skill = Tasks.Skill
                                    ),
                       PayRateID = (
                                      select PayRateID from PayRates where 
                                      PayRate = Tasks.PayRate
                                    )
    
  • Шаг четвертый: проверить все на месте

  • Шаг пятый: удалить старые столбцы из таблицы «Задачи», сделать новые поля ненулевыми

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