Зачем использовать миграцию базы данных вместо схемы с управлением версиями - PullRequest
12 голосов
/ 04 апреля 2009

Миграции, несомненно, лучше, чем просто запуск phpMyAdmin и изменение схемы вольно-невольно (как я делал в течение моих дней php), но после их использования на некоторое время, я думаю, что они смертельно несовершенны.

Контроль версий - это решенная проблема. Основная функция миграции - вести историю изменений в вашей базе данных. Но хранить разные файлы для каждого изменения - неуклюжий способ их отслеживания. Вы не создаете новую версию post.rb (или файл, представляющий дельту), когда хотите добавить новый атрибут virtual - зачем создавать новую миграцию, когда вы хотите добавить новый не виртуальный атрибут?

Другими словами, точно так же, как вы проверяете post.rb в управлении версиями, почему бы не зайти в schema.rb в управление версиями и не внести изменения в файл напрямую?

Функционально это то же самое, что хранить файл для каждой дельты, но с ним гораздо проще работать. Моя ментальная модель такова: «Я хочу, чтобы таблица X имела такие-то и такие-то столбцы (или действительно, я хочу, чтобы модель X имела такие-то и такие-то свойства)» - почему вы должны из этого сделать вывод, как добраться из существующей схемы; просто откройте schema.rb и дайте таблице X правильные столбцы!

Но даже идея, что классы переносят таблицы, является деталью реализации! Почему я не могу просто открыть post.rb и сказать:

 Class Post
    t.string :title
    t.text :body
 end

Если бы вы использовали такую ​​модель, вам нужно было бы принять решение о том, что делать с существующими данными. Но даже в этом случае миграции излишни - когда вы переносите данные, вы теряете верность, когда используете метод миграции down.

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

Ответы [ 6 ]

9 голосов
/ 04 апреля 2009

почему бы не проверить schema.rb в системе контроля версий и внести изменения в файл напрямую?

Поскольку сама база данных не синхронизирована с управлением версиями.

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

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

6 голосов
/ 04 апреля 2009

Просто перефразируя сказанное другими: миграции позволяют защитить данные по мере развития вашей схемы. Идея поддержки одного schema.rb файла привлекательна только до тех пор, пока ваше приложение не будет запущено в производство. После этого вам потребуется способ перенести данные ваших существующих пользователей при изменении схемы.

5 голосов
/ 04 апреля 2009

Существуют также вопросы, связанные с данными, которые важно учитывать, и какие миграции решают.

Скажем, в старой версии моей схемы есть столбцы feet и inches. В целях эффективности я хочу объединить это в столбец inches, чтобы упростить сортировку и поиск.

Моя миграция может объединять все данные в футах и ​​дюймах в столбец дюймов (футы * 12 + дюймы) при обновлении базы данных (т. Е. Непосредственно перед удалением столбца feet)

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

2 голосов
/ 04 апреля 2009

В их нынешнем виде они раздражают и неадекватны, но, вполне возможно, лучший вариант, который у нас есть в настоящее время. Довольно много умных людей потратили немало времени, работая над этой проблемой, и это пока лучшее, что они смогли придумать. После примерно 20 лет обновлений версий баз данных, написанных преимущественно вручную, я очень быстро оценил миграцию как значительное улучшение, когда нашел ActiveRecord.

Как вы говорите, контроль версий - это решенная проблема. До некоторого момента я бы согласился: это очень хорошо подходит для текстовых файлов, в частности, для других типов файлов, и совсем не так много для таких ресурсов, как базы данных.

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

Что касается объявления содержимого таблицы в модели, я считаю, что именно этим и занимается DataMapper (без личного опыта). Я думаю, что там также могут быть некоторые возможности вывода DDL.

«Даже если вы не можете придумать лучшего пути, разве миграции не являются грубыми?»

Да. Но они менее грубые, чем все остальное, что у нас есть. Пожалуйста, дайте нам знать, когда вы выполнили не грубую альтернативу.

2 голосов
/ 04 апреля 2009

Полагаю, учитывая, что «даже если вы не можете придумать лучшего пути», тогда да, по большому счету, миграции являются своего рода грубыми. Как и Ruby, Rails, ORM, SQL, веб-приложения, ...

Миграции имеют (немаловажное) преимущество в том, что они существуют. Грубое, но существующее имеет тенденцию побеждать приятного, но несуществующего. Я уверен, что, вероятно, есть приятные и несуществующие способы переноса ваших данных, но я не уверен, что это значит. : -)

0 голосов
/ 04 апреля 2009

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

Альтернатива заключается в том, что большие группы программистов (например, 10-15 разработчиков Java, где я работаю) в конечном итоге полагаются на пару выделенных администраторов баз данных на полный рабочий день, чтобы выполнить это вместе с другими обязанностями по обслуживанию, оптимизации и т. Д.

...