Миграция данных из устаревшей структуры данных в новую структуру данных

Ok Итак, вот проблема, с которой мы сталкиваемся.

:
  1. у нас есть тонны устаревших приложений, которые имеют прямой доступ к базе данных
  2. структура данных в базе данных не нормируется
  3. текущий процесс / структура используется почти всеми приложениями

Что мы пытаемся реализовать:

  1. переместить все функции в Службу RESTful, чтобы ни одно приложение не имело прямой базы данных доступ
  2. реализовать нормализованную структуру данных

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

наше текущее решение:

  1. определите все функциональные возможности CRUD и реализуйте это в новом веб-сервисе
  2. создание новых приложений для замены устаревших приложений
  3. укажите новые приложения на новую веб-службу ( Все еще указывая на старую структуру данных)
  4. перенос данных в новую структуру
  5. укажите новые приложения на новую веб-службу (укажите новую структуру данных )

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

Я хотел знать, сталкивался ли кто-нибудь с такими проблемами и как вы преодолели эти типы проблем/реализации и тому подобное.

3 ответов


редактировать: больше объяснений синхронизации с использованием двунаправленных триггеров; обновления для синтаксиса, языка и ясности.

преамбула

Я столкнулся с аналогичными проблемами при обновлении модели данных в большом веб-приложении, над которым я работал в течение 7 лет, поэтому я чувствую вашу боль. Из этого опыта, я бы предложил что-то немного другое - но надеюсь, что будет намного легче реализовать. Но сначала замечание:--3-->

значение организация данных-данные долго переживут все ваши текущие приложения. Бизнес будет постоянно изобретать новые способы получения ценности из данных, которые он захватил, что породит новые отчеты, приложения и способы ведения бизнеса.

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

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

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

Почему веб-службы RESTful?

вы упоминаете, что ваша воля " переместить все функциональность службы RESTful, поэтому ни одно приложение не имеет прямого доступа к базе данных". Мне нужно задать очень важный вопрос относительно устаревших приложений: почему это важно и какую ценность это принесло?

Я спрашиваю потому, что:

  • вы теряете транзакции ACID (каждый вызов является одной транзакцией, если вы не реализуете некоторые ужасно сложные стандарты WS -*)
  • снижение производительности: прямые подключения к базе данных будут быстрее (без веб-сервера работа и переводы) и имеют меньшую задержку (обычно 1 мс, а не 50-100 мс), которая будет заметно уменьшите отзывчивость в приложениях, написанных для прямых подключений к БД
  • структура базы данных не абстрагируется от службы RESTful, поскольку вы признаете, что с нормализацией базы данных вам нужно переписать веб-службы и переписать вызывающие их приложения.

и другие сквозные проблемы без изменений:

  • управляемость: прямые подключения к базе данных можно контролировать и управлять многими универсальными инструментами здесь
  • безопасность: прямые соединения более безопасны, чем веб-службы, которые ваши разработчики напишут,
  • авторизация: модель разрешений базы данных очень продвинутая и настолько мелкозернистая, насколько вы могли бы хотеть
  • масштабируемость: веб-служба-это (только?) непосредственно подключенное приложение базы данных и поэтому масштабируется только как многое, как база данных

вы можете перенести базу данных и сохранить устаревшие приложения запущенными, поддерживая устаревший RESTful API. Но что, если мы можем сохранить устаревшие приложения без представляем услугу RESTful "legacy".

управление версиями базы данных

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

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

Это на самом деле довольно легко реализовать, но решает только отчетность и функциональность только для чтения. Как насчет устаревшего приложения DML? DML можно решить с помощью

  • обновляемые представления для простых преобразований
  • внедрение хранимых процедур где обновляемые представления невозможны (например, " вызов insert_emp (?, ?, ?)" а не "вставить в пуп (столбца col1, столбец col2, кол3) значения (?, ? ?)".
  • есть "устаревшая" таблица, которая синхронизируется с новой базой данных с триггерами и ссылками БД.

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

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

  • фундаментальная структура изменилась (например, изменение мощности отношения), или
  • перевод в устаревший формат является сложной функцией (например, если устаревший столбец является квадратом значения столбца нового формата и установлен в "4", обновляемое представление не может определить, является ли правильное значение +2 или -2).

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

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

Это также позволяет сосредоточиться на реальной ценности для организации:

  • новая структура базы данных
  • новый RESTful web services
  • новые приложения (потенциально строить с помощью веб-служб RESTful)

положительный аспект веб-сервисов

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


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

параллельно вам нужно определить, что составляет (cerntralized) legacy db api, и сопоставить его с вашей нормализованной моделью. Теперь, на досуге, замените исходные вызовы legacy db вызовами legacy API для БД. Это не нарушает код.

Как только исходные вызовы полностью заменены, вы можете переключить модель данных на реальную нормализованную. Это не должно нарушать код, так как теперь все идет против устаревшего API db или нормализованного API db.

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

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

этот документ, похоже, имеет хороший обзор: http://se-pubs.dbs.uni-leipzig.de/files/Cleve2006CotransformationsinDatabaseApplicationsEvolution.pdf


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

во - первых, усилия по изменению ваших клиентских приложений будут значительными - если базовый домен изменится (например, путем введения концепции адреса, отдельного от человека), клиентские приложения также изменятся-это не просто изменение способа доступа к данным. Лучший способ избежать этой боли-написать свой уровень API, чтобы отразить модель бизнес-домена будущего, и склеить старую схему базы данных в нее; если есть новые концепции, которые вы не можете отразить, используя старые данные (например, "get /app/addresses/addressID"), бросьте NotImplemented ошибку. Там, где вы можете отразить новую модель со старыми данными, соедините ее вместе, как можно лучше, а затем пересчитайте под обложками.

во-вторых, это означает, что вам нужно построить управление версиями в вашем API как первоклассная забота-поэтому вы можете сказать клиентам, что в версии 1 функции x, y и z бросают "NotImplemented" исключения. Каждая версия должна быть обратно совместима, но добавлять новые функции. Таким образом, вы можете рефакторировать функции в версии 1, Если вы не нарушаете службу, и реализовать функцию x в версии 1.1, функцию y в версии 1.2 и т. д. В идеале у вас должна быть дорожная карта для ваших версий и уведомление владельцев клиентских приложений, Если вы собираетесь прекратить поддержку версии или выпустить разрывное изменение.

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

надеюсь, что это полезно - я не думаю, что есть один простой ответ на ваш вопрос.