Каков наилучший способ отказаться от столбца в схеме базы данных? - PullRequest
9 голосов
/ 13 марта 2009

После прочтения многих вопросов здесь о миграции и версиях схемы БД, я придумал схему безопасного обновления схемы БД во время нашего процесса обновления. Основная идея заключается в том, что во время обновления мы экспортируем базу данных в файл, удаляем и заново создаем все таблицы, а затем повторно импортируем все. Там нет ничего необычного или рискованного.

Проблема в том, что эта система несколько «вирусная», что означает, что безопасно добавлять столбцы или таблицы, поскольку их удаление вызовет проблемы при повторном импорте данных. Обычно мне было бы хорошо просто игнорировать эти столбцы, но проблема в том, что многие из удаленных элементов были фактически реорганизованы, а наличие старых в коде обманывает других программистов, заставляя их думать, что они могут их использовать.

Итак, я хотел бы найти способ пометить столбцы или таблицы как устаревшие. В идеальном случае устаревшие объекты были бы помечены при обновлении схемы, но затем во время следующего обновления наш скрипт резервного копирования просто не ВЫБИРАЛ объекты, помеченные таким образом, что позволило бы нам постепенно исключить эти части схемы. .

Я обнаружил, что MySQL (и, возможно, другие платформы БД, но именно эту мы используем) поддерживает атрибут COLUMN как для полей, так и для таблиц. Это было бы прекрасно, за исключением того, что я не могу понять, как на самом деле использовать его осмысленно. Как мне написать SQL-запрос, чтобы получить все имена столбцов, которые , а не содержат текст комментария, соответствующий слову «устарел»? Или я все смотрю на эту проблему неправильно и упускаю гораздо лучший способ сделать это?

Ответы [ 2 ]

7 голосов
/ 13 марта 2009

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

3 голосов
/ 13 марта 2009

" Deprecate " обычно означает (по крайней мере для меня), что что-то помечено для удаления в будущем, не должно использоваться новыми функциями и будет удалено / изменено в существующем коде.

Я не знаю хорошего способа «пометить» устаревший столбец, кроме как переименовать его, что может привести к поломке! Даже если бы существовал такой объект, насколько он был бы полезен?

Так вы действительно хотите осудить или удалить? Исходя из содержания вашего вопроса, я предполагаю последнее.

У меня неприятное ощущение, что вы можете оказаться в одной из тех ситуаций, "если бы я хотел туда попасть, я бы не начал отсюда". Однако вот некоторые идеи, которые приходят на ум:

  1. Чтение Рецепты для непрерывной интеграции базы данных , которая, кажется, решает большую часть вашей проблемной области

  2. Явно отбросьте столбец. В MySQL 5.0 (и даже раньше?) Средство существует как часть DDL: см. Синтаксис ALTER TABLE .

  3. Посмотрите, как ActiveRecord :: Migration работает в Ruby. Миграция может включать директиву remove_column, которая решит проблему подходящим для платформы способом. Это определенно работает с MySQL, из личного опыта.

  4. Запустите сценарий для экспорта, чтобы удалить столбец из операторов INSERT, как столбцов, так и списков значений. Вероятно, вполне жизнеспособным, если ваша БД достаточно мала, что, я думаю, должно быть, если вы экспортируете и повторно импортируете ее, как описано.

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