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