Рефакторинг баз данных
Для начала… Избегайте сверхспециализации (overspecialization) Разработчик приложенияРазработчик базы данных Разработчик Коммуникация Сотрудничество Обмен опытом Барьер
Определение Рефакторинг базы данных - изменение схемы базы данных, улучшающее ее дизайн, но не влияющее на ее поведенческую и информационную семантику Содержит как структурные, так и функциональные аспекты
Что рефакторить в БД? БД содержит: Данные (хранимые в соответствие со схемой) Хранимый код Хранимый код ничем не отличается от любого другого кода (его необходимо тестировать) Схема данных (таблицы, индексы и т.д.) Наличие данных усложняет рефакторинг схемы!
Зачем рефакторить? Исправление БД, доставшейся «в наследство» Обеспечивать эволюционное развитие Предотвратить избыточный дизайн (over-design)
Запахи плохого кода в БД Для хранимого кода применимы все рассмотренные запахи кода, включая: Процедуры-монстры Лапша-код (спагетти-код) Дублирование кода Перенасыщение условными операторами и т.д. Запахи, характерные для БД: Таблица/столбец широкого назначения Избыточные данные (повторяющиеся в нескольких таблицах) Таблица с огромным количеством столбцов/строк «Умные» столбцы (с кодом xml) Недостаток ограничений (отсутствие валидации) Страх внесения изменений в схему данных или процедуру
Страх внесения изменений Самый «вонючий запах» Препятствует развитию Снижает эффективность Наводит еще больший беспорядок Со временем становится только хуже
Как правильно действовать? Создать свою песочницу (sandbox) разработки Перенести изменения в песочницу интеграции Внедрить в производство (production)
Песочницы Частые развертыванияКонтролируемые развертывания Сильно контролируемые развертывания
Лучший случай (наипростейший)
Худший случай (сложнейший)
Тривиальные вещи Возможно ли переименовать столбец в БД без изменения сотни приложений? Если мы не можем сделать даже такую тривиальность, как мы можем сделать что-то поистине серьезное?
Модульные тесты в БД Слишком сложно? Нет хорошего средства тестирования (framework)?
Запуск модульных тестов Анонимный PL/SQL код Нет необходимости изменять БД Вызов raise_application_error с конкретным сообщением в случае возникновения ошибки Откат (rollback) по завершению теста Запуск при помощи любого SQL средства или ant-скриптов
Пример теста
Логи изменений (changelog) Необходимо отслеживание изменений Написание дельта-скриптов (миграций) В начале переходного периода В конце переходного периода Одинаковые скрипты для Обновления песочниц Развертывания на производстве
Простой скрипт
Версионирование
Работа в команде Разработчики Тесная кооперация с администраторами БД Навыки работы с БД Администраторы БД и проектировщики БД Должны быть вовлечены в процесс разработки приложения Навыки разработки приложений
Средства тестирования Дельта-скрипты Dbdeploy, liquibase, deltasql Легко писать самостоятельно PL/SQL код и