2008-11-02 10 views
2

Одна из моих целей - это возможность развертывания новой версии веб-приложения, которое работает рядом с старой версией. Уловка заключается в том, что все разделяет базу данных. База данных, которая в новой версии имеет тенденцию включать значительный рефакторинг в таблицы базы данных. Я бы хотел, чтобы с новой версией приложения была запущена новая версия приложения, и мне нужно было вернуться к старой версии.Управление миграцией изменений базы данных в базу данных, совместно используемую старой версией того же приложения

Орны был хороший post Наладки проблемы, но она закончилась:

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

Последующий пост никогда не появлялся ;-). Как бы вы справились с управлением миграцией изменений базы данных в базу данных, совместно используемую старой версией того же приложения. Как бы вы синхронизировали данные?

+0

Включает ли ваш вопрос также развертывание изменений базы данных? –

ответ

1

Если старая версия должна поддерживаться, изменения просто не могут быть нарушены. Это также помогает при развертывании новой версии веб-приложения - если вам нужно откат, то действительно помогает, если вы можете оставить базу данных такой, какой она есть.

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

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

3

Читать книгу Скотта Амблера «Refactoring Databases»; возьмите с собой щепотку соли, но там есть много хороших идей.

Сведения о доступных решениях зависят от используемой СУБД. Тем не менее, вы можете сделать что-то вроде:

  • создать новую таблицу (или несколько новых таблиц) для нового дизайна
  • создать вид со старым именем таблицы, которая собирает данные из новых таблиц (ы)
  • создать «вместо» триггеров на представлении, чтобы обновить новые таблицы вместо представления

в некоторых случаях, вам не нужен новая таблица - вы можете просто нужны триггера.

0

Предполагая, что только 2 версии вашего клиента, я бы сохранил только одну копию данных в новых таблицах.

Вы можете сохранить контракт между старыми и новыми приложениями за представлениями поверх новых таблиц. Используйте перед/вместо триггеров для обработки записей в «старые» представления, которые фактически записываются в новые таблицы.

Вы поддерживаете 2 версии кода и должны по-прежнему разрабатывать свое старое приложение, но это неизбежно.

Таким образом, нет проблем с синхронизацией, эффективно вам придется иметь дело с конфликтами репликации между «старыми» и «новыми» схемами.

Более 2 варианта усложняется, как указано ...

0

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

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

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

У нас есть на данный момент два правила, которые мы пытаемся следовать:

  1. Первое, что старый код (SQL, хранимых проки, функции и т.д.) работает как и должно быть, как это , не изменяя слишком много, если нет случая (ошибка или изменение функции), и, конечно, попытайтесь документировать его как можно больше (особенно такие проблемы, как: «WTF !, почему он это сделал вместо этого?»).

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

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

Рефакторинг базы данных - очень сложное поле, на которое нужно ответить в короткий ответ. Есть много книг, которые отвечают на все ваши проблемы, one http://databaserefactoring.com/ заострен в одном из answers.

Позже Редактировать: Надеемся, что второе правило также ответит на обработку нарушений.