Как вы управляете обновлениями схемы рабочей базы данных?

StackOverflow https://stackoverflow.com/questions/29744

  •  09-06-2019
  •  | 
  •  

Вопрос

Кажется, это упущенная из виду область, которая действительно могла бы пригодиться.Каковы ваши лучшие практики для:

  • выполнение процедуры обновления
  • откат в случае ошибки
  • синхронизация изменений кода и базы данных
  • тестирование перед развертыванием
  • механика модификации стола

и т. д...

Это было полезно?

Решение

Это отличный вопрос.(Высока вероятность, что это закончится дебатами о нормализованных и денормализованных базах данных... которые я не собираюсь начинать...ок, теперь немного информации.)

кое-что, что пришло мне в голову (добавлю больше, когда у меня будет больше времени или мне понадобится перерыв)

дизайн клиента - именно здесь метод встроенного sql в VB (даже с подготовленными операторами) доставляет вам проблемы.Вы можете потратить ВЕКИ, просто находя эти утверждения.Если вы используете что-то вроде Hibernate и помещаете столько SQL в именованные запросы, у вас есть одно место для большей части sql (нет ничего хуже, чем пытаться протестировать sql, который находится внутри некоторого оператора IF, и вы просто не нажимаете «триггер») критерии в вашем тестировании для этого оператора ЕСЛИ).Прежде чем использовать спящий режим (или другие orms), когда я выполнял SQL непосредственно в JDBC или ODBC, я помещал все операторы sql либо в общедоступные поля объекта (с соглашением об именах), либо в файл свойств (также с именем соглашение о значениях, например PREP_STMT_xxxx.И используйте либо отражение, либо перебор значений при запуске в а) тестовых примерах б) запуске приложения (некоторые rdbms позволяют предварительно компилировать подготовленные операторы перед выполнением, поэтому при запуске после входа в систему я бы предварительно скомпилировал подготовительный файл). stmts при запуске, чтобы приложение самотестировалось.Даже для сотен операторов на хорошей СУБД это всего несколько секунд.и только один раз.И это очень спасло мою задницу.В одном проекте администраторы базы данных не могли общаться (другая команда, в другой стране), и схема, казалось, менялась НОЧЬЮ без всякой причины.И каждое утро мы получали список того, где именно сломалось приложение при запуске.

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

Если можете, попробуйте также использовать хранимые процедуры.Их немного сложнее протестировать, как указано выше.Некоторые базы данных также не проверяют предварительно sql в хранимых процессах на соответствие схеме во время компиляции, только во время выполнения.Обычно это включает в себя, скажем, создание копии структуры схемы (без данных) и последующее создание всех хранимых процедур для этой копии (на случай, если команда БД, внесшая изменения, НЕ ПРОВЕРИЛА правильно).Таким образом можно проверить структуру.но с точки зрения управления изменениями хранимые процедуры хороши.На перемене все понятно.Особенно, когда изменения БД являются результатом изменений бизнес-процессов.И все языки (java, vb и т. д.) будут изменены.

Обычно я также настраиваю таблицу, которую использую, под названием system_setting и т. д.В этой таблице мы храним идентификатор VERSION.Это сделано для того, чтобы клиентские библиотеки могли подключаться и проверять, действительны ли они для этой версии схемы.В зависимости от изменений в вашей схеме вы не хотите разрешать клиентам подключаться, если они могут повредить вашу схему (т.у вас не так много ссылочных правил в базе данных, но на клиенте).Это зависит от того, собираетесь ли вы иметь несколько версий клиента (что происходит в НЕ-веб-приложениях, т.е.они используют неправильный двоичный файл).Вы также можете использовать пакетные инструменты и т. д.Другой подход, который я также использовал, — это определить набор схем для версий операций в каком-то файле свойств или снова в таблице system_info.Эта таблица загружается при входе в систему, а затем используется каждым «менеджером» (обычно у меня есть какой-то клиентский API для выполнения большинства операций с базой данных) для проверки правильности этой операции для этой операции.Таким образом, большинство операций могут быть успешными, но вы также можете потерпеть неудачу (выдать какое-то исключение) для устаревших методов и сообщить вам, ПОЧЕМУ.

управление изменением схемы -> обновляете ли вы таблицу или добавляете отношения 1-1 к новым таблицам?По этой причине я видел много магазинов, которые всегда получают доступ к данным через представление.Это позволяет изменять имена таблиц, столбцов и т. д.Я подумывал о том, чтобы рассматривать представления как интерфейсы в COM.то есть.вы добавляете новый VIEW для новых функций/версий.Часто вас здесь привлекает то, что у вас может быть множество отчетов (особенно пользовательских отчетов), которые предполагают табличные форматы.Представления позволяют развернуть новый формат таблиц, но поддерживают существующие клиентские приложения (помните все эти надоедливые специальные отчеты).

Также необходимо написать скрипты обновления и отката.и снова ТЕСТ, ТЕСТ, ТЕСТ...

------------ ОК - ЭТО НЕМНОГО СЛУЧАЙНОЕ ВРЕМЯ ОБСУЖДЕНИЯ --------------

На самом деле был крупный коммерческий проект (т.магазин программного обеспечения), где у нас возникла та же проблема.Архитектура была двухуровневой, и они использовали продукт, немного похожий на PHP, но на базе PHP.То же самое.другое имя.во всяком случае я зашел на версии 2....

Обновление стоило МНОГО ДЕНЕГ.Много.то есть.подарите недели бесплатного консультационного времени на месте.

И дошло до того, что захотелось либо добавить новые функции, либо оптимизировать код.Часть существующего кода использовала хранимые процедуры, поэтому у нас были общие точки, по которым мы могли управлять кодом.но в других областях была встроенная разметка sql в html.Это было здорово для быстрого выхода на рынок, но с каждым появлением новых функций стоимость тестирования и поддержки увеличивалась как минимум вдвое.Поэтому, когда мы рассматривали возможность извлечения кода типа PHP, добавления слоев данных (это было в 2001-2002 годах, до каких-либо ORM и т. д.) и добавления множества новых функций (отзывы клиентов), мы рассмотрели вопрос о том, как проектировать ОБНОВЛЕНИЯ. в систему.Это очень важно, поскольку правильное обновление стоит больших денег.Большинство шаблонов и всего остального, что люди обсуждают с определенной долей энергии, имеют дело с выполняемым объектно-ориентированным кодом, но как насчет того факта, что ваши данные должны: а) интегрироваться в эту логику, б) смысл, а также структуру данные могут меняться со временем, и часто из-за того, как работают данные, в организации вашего клиента возникает множество подпроцессов/приложений, которым нужны эти данные -> специальные отчеты или любые сложные пользовательские отчеты, а также пакетные задания. что было сделано для пользовательских фидов данных и т. д.

Имея это в виду, я начал играть с чем-то немного левым.Также есть несколько предположений.а) данные больше читаются, чем записываются.б) обновления происходят, но не на уровне банка, т.е.скажем, один или два в секунду.

Идея заключалась в том, чтобы применить представление COM/Interface к тому, как клиенты получают доступ к данным через набор КОНКРЕТНЫХ таблиц (которые менялись в зависимости от изменений схемы).Вы можете создать отдельное представление для каждого типа операции: обновление, удаление, вставка и чтение.Это важно.Представления будут либо напрямую отображаться в таблице, либо позволят вам запускать фиктивную таблицу, которая выполняет реальные обновления или вставки и т. д.На самом деле мне хотелось создать какую-то перехватываемую косвенность уровня, которую все еще можно было бы использовать в Crystal Reports и т. д.ПРИМЕЧАНИЕ. Для вставки, обновления и удаления вы также можете использовать сохраненные процедуры.И у вас была своя версия для каждой версии продукта.Таким образом, ваша версия 1.0 имела свою версию схемы, и если бы таблицы изменились, у вас все равно были бы представления версии 1.0, но с НОВОЙ внутренней логикой для сопоставления с новыми таблицами по мере необходимости, но у вас также были представления версии 2.0, которые поддерживали бы новые поля и т. д.На самом деле это было просто для поддержки специальных отчетов, которые, если вы БИЗНЕС-человек, а не программист, вероятно, и являются главной причиной того, почему у вас есть этот продукт.(Ваш продукт может быть дерьмовым, но если у вас лучшая отчетность в мире, вы все равно можете выиграть, верно обратное: ваш продукт может быть лучшим с точки зрения функциональности, но если он хуже по отчетности, вы можете очень легко проиграть).

хорошо, надеюсь, что некоторые из этих идей помогут.

Другие советы

Ликвибаза

сайт liquibase.org:

  1. он понимает определения спящего режима.
  2. он генерирует лучший SQL обновления схемы, чем спящий режим
  3. он регистрирует, какие обновления были сделаны в базе данных
  4. он обрабатывает двухэтапные изменения (т.е.удалите столбец «foo», а затем переименуйте другой столбец в «foo»)
  5. он реализует концепцию условных обновлений
  6. разработчик на самом деле прислушивается к сообществу (с спящим режимом, если вы не в толпе или не новичок - вас по сути игнорируют.)

http://www.liquibase.org

мнение

приложение должно никогда обработать обновление схемы.Это катастрофа, которая ждет своего часа.Данные сохраняются дольше, чем приложения, и как только несколько приложений попытаются работать с одними и теми же данными (например, производственное приложение + приложение для создания отчетов), скорее всего, они оба будут использовать одни и те же базовые библиотеки компании...а затем обе программы решают выполнить собственное обновление базы данных...веселиться с что беспорядок.

Я большой поклонник Красные ворота продукты, которые помогают создавать пакеты SQL для обновления схем баз данных.Сценарии базы данных можно добавить в систему управления версиями, чтобы облегчить управление версиями и откат.

В целом мое правило такое:«Приложение должно управлять собственной схемой».

Это означает, что сценарии обновления схемы являются частью любого пакета обновления приложения и запускаются автоматически при запуске приложения.В случае ошибок приложение не запускается и транзакция сценария обновления не фиксируется.Обратной стороной этого является то, что приложение должно иметь полный доступ к изменению схемы (это раздражает администраторов баз данных).

Я добился большого успеха в использовании функции Hibernates SchemaUpdate для управления структурами таблиц.Оставьте сценарии обновления только для обработки фактической инициализации данных и периодического удаления столбцов (SchemaUpdate этого не делает).

Что касается тестирования, поскольку обновления являются частью приложения, их тестирование становится частью цикла тестирования приложения.

Запоздалая мысль:Принимая во внимание некоторую критику в других сообщениях здесь, обратите внимание, что правило гласит «это собственное».Это действительно применимо только там, где приложение владеет схема, как это обычно бывает с программным обеспечением, продаваемым как продукт.Если ваше программное обеспечение использует базу данных совместно с другим программным обеспечением, используйте другие методы.

Это все важные темы, но вот моя рекомендация по обновлению.

Вы не указали свою платформу, но для сред сборки NANT я использую Тарантино.Для каждого обновления базы данных, которое вы готовы зафиксировать, вы создаете сценарий изменения (используя RedGate или другой инструмент).Когда вы запускаете производство, Тарантино проверяет, был ли запущен сценарий в базе данных (он добавляет таблицу в вашу базу данных для отслеживания).Если нет, то скрипт запускается.Требуется вся ручная работа (читай:человеческая ошибка) из-за управления версиями базы данных.

Как сказал Пэт, используйте жидкость.Особенно, если у вас есть несколько разработчиков с собственными базами данных DEV, вносящих изменения, которые станут частью производственной базы данных.

Если есть только один разработчик, как в одном проекте, над которым я сейчас работаю (ха), я просто фиксирую изменения схемы в виде текстовых файлов SQL в репозиторий CVS, который я проверяю партиями на рабочем сервере, когда вносятся изменения в код. .

Но ликвидабаза организована лучше!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top