Создание сценариев под управлением версиями и непрерывной интеграции для проверки их
Один подход, который работал для меня, заключался в том, чтобы каждый разработчик работал со своей собственной схемой, с которой он может делать то, что ему нравится. Их схема была разрушаема и заполнена тестовыми данными, взятыми из набора скриптов с управлением версиями, в который участвовали все разработчики.
Ночная непрерывная сборка интеграции взяла последнюю версию всех сценариев и попыталась создать из них связную тестовую базу данных. Затем приложение провело серию интеграционных и функциональных тестов, чтобы проверить, соответствует ли текущая схема текущему кандидату на выпуск.
Перед тем, как начать этот путь, существовал довольно солидный дизайн базы данных, и администратор БД всегда следил за тем, чтобы разработчики не сходили с ума от денормализации и других ужасов.
Здесь очень помог контроль версий, потому что изменения в скриптах были сразу очевидны. Мы также использовали VERSION
таблицу базы данных для определения общего состояния базы данных. Это была простая целочисленная последовательность и не была связана с каким-либо конкретным приложением.
В целом, это работало хорошо и означало, что разработчики перестали бояться менять уровни персистентности, потому что они всегда могли откатить свои собственные схемы, не влияя на другие.
Подход, который я использую, заключается в предоставлении одной таблицы для параметров. Эта таблица будет иметь одну пару имя / значение для версии, в которой находится база данных. Это дает мне два преимущества: у меня есть способ проверить, что через приложение было применено только исправление базы данных, и я могу использовать это значение для моих сценариев SQL.
Сценарий SQL создаст новые таблицы, изменит столбцы и все, что требуется для работы с базой данных для продвижения сценария из предыдущей версии. В идеале у меня также был бы сценарий отката, но в большинстве случаев у меня его нет.
Кстати, весь этот подход был автоматизирован как часть Ruby on Rails вместе со сценариями отката. Мне нравится идея этого, но не все рамки делают это. Когда я не использую Ruby on Rails, я использую подход, описанный выше.
источник