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