x
 
Виктор Карпов
7 марта 2013

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

Как это организовано у вас, какие инструменты используете?



В последнее время я всерьёз озадачен отношениями кода и данных. Есть множество систем управления данными: реляционных и безэскуэльных. Разработчики ломают копья, выясняя, какая из них быстрее пишет и читает данные, расходует меньше оперативной памяти, проводит меньше дисковых операций. Но во времена, когда «Ватсон» закончил медвуз и отправился лечить людей, ни одна популярная система управления данными не может проанализировать лог запросов к самой себе и банально расставить нужные индексы. Вместо этого она предоставляет мегатонны отличного конфига с миллиардом настроек, предлагая администраторам продираться через дебри ридми, хауту и факъю.

Я применяю концепцию полной абстракции от СУБД, где данные представлены в коде, как объекты и связи между ними. Объект — представление строки из таблицы в виде класса со свойствами, соответсвующими её полям. Связь — представление таблицы, которая хранит идентификаторы связаных объектов. Очень важно, что связи не хранятся в самих объектах, так как по умолчанию они все «многие-ко-многим» и не имеют направления.

Вся работа с объектами и связями осуществляется через веб-интерфейс. Одним из приятных бонусов является удобное распространение изменений. Помимо изменения базы данных, веб-интерфейс ведёт лог изменений базы данных в формате эскуэль-запросов. Этот лог используется в другой копии проекта для применения этих изменений. Процесс запускается два раза. Первый — «сухой прогон», изменения симулируются. Система проверяет, нет ли конфликтов. Если нет, то запускает второй прогон и изменяет базу данных. Если конфликты есть, то выводит их описание и останавливает процесс.

По моему опыту, большинство конфликтов случается из-за несоблюдения технологического процесса и гайдлайнов разработки. Предупредить их можно хорошим фреймворком. И я говорю не о «Рельсах», «Симфони», «Иии» или «Зенде», а о системе работы: оформлении кода, именовании переменных, правилах вёрстки, написании документации, передаче работы друг другу.

P. S.
Это был совет о разработке программных интерфейсов. Хотите узнать всё об умной вёрстке, правильных скриптах, грациозной деградации, трюках и работе технолога с дизайнером? Присылайте вопросы.

Поделиться
Отправить

Комментарии

Михаил Озорнин
7 марта 2013

В простом случае пишутся сиквел-скрипты, которые умеют переводить базу версии n в базу версии n+1. Текущая версия базы хранится в специальной колонке. При запуске приложения модуль миграции вычисляет, какие миграции нужно запускать и последовательно их выполняет, инкрементируя номер версии в колонке.

Многие современные фреймворки объектно-реляционного мэппинга часто умеют выполнять миграции сами при изменении мэппингов. «Хибернейт» и «Энтити фреймворк» так умеют. Некоторые фреймворки представляют встроенные инструменты миграции, хотя и не генерируют миграции автоматически. Например, облегчает работу с миграциями Руби-он-рейлс.

Немного сложней обстоит дело, если у продукта несколько модификаций (например, есть базовая версия продукта и кастомизации под каждого из клиентов). Тогда главное — обеспечить запуск миграций в нужном порядке. Без синхронизации команд разработки базового продукта и кастомизаций тут почти всегда не обойтись.


Цель рубрики — обсуждение вопросов дизайна всех видов, текста в дизайне и взаимоотношений дизайнеров с клиентами.

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

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

Вот такой веб 2.0.

EM или REM? 6 Можно ли достичь эффекта переливания без встраивания видео на сайт? 1




Недавно всплыло

7 Иногда я спрашиваю о скидке для тренировки и потому что не против шанса сэкономить 1 2 1