Архитектура для одной базы данных и нескольких приложений - PullRequest
2 голосов
/ 04 августа 2009

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

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

Ответы [ 7 ]

4 голосов
/ 04 августа 2009

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

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

Это соглашение даст вам единственное место для применения правил, относящихся к этим данным. Измените их в одном месте, и все клиенты увидят их сразу.

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

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

1 голос
/ 04 августа 2009

Очистка данных на самом низком уровне обычно означает выполнение некоторой ссылочной целостности и работы с первичным и внешним ключами. Это должно быть сделано в хранимых процедурах (чтобы хранимые процедуры знали, что значение из последовательности / генератора A_seq должно быть помещено в первичный ключ таблицы A, и это также должно быть помещено в A_id в таблицу B и т. Д.). Например, может существовать некоторая хранимая процедура под названием SavePurchaseHead, SavePurchaseDetails, GetSegmentForCustomer, GetCustomerBalance, GetOverdueLevelForSegment и т. Д. Это делается главным образом для того, чтобы скрыть логику инструкций INSERT, UPDATE или JOIN sql внутри базы данных.

А теперь представьте, куда вы захотите поместить некоторые знания о бизнесе, например: «Клиент, просроченный на 5000 долларов США, не может совершить новую покупку, пока он не заплатит наличными»? Хранимые процедуры, как правило, являются плохой идеей для таких вычислений. Лучшее решение состоит в том, чтобы иметь какой-либо бизнес-сервис, такой как MakeNewPurchase, который будет принимать данные клиентов и данные о закупках, а также заниматься бизнесом. Эта услуга, вероятно, может начинаться с получения информации о клиентском сегменте, а затем с баланса клиента и сравнения его с уровнем просроченного сегмента. Если все будет в порядке, будут выполнены такие процедуры, как SavePurchaseHead и SavePurchaseDetails.

Таким образом, у вас будет несколько уровней знаний: клиентские приложения будут знать только, что для совершения покупки вам необходимо позвонить в службу MakeNewPurchase. Они будут говорить на «деловом языке». Плюс - важные изменения в бизнес-логике должны быть сделаны только в одном месте (уровень бизнес-логики) вместо пяти приложений. Слой бизнес-логики будет знать, как устроен бизнес, но будет недостаточно знаний о том, как составляется пользовательский интерфейс, и будет недостаточно знаний о том, как именно хранятся и оптимизируются данные. База данных будет иметь только знания о данных и как они хранятся. Это разделит обязанности между всеми уровнями, и, работая в команде разработчиков, это поможет вам поддерживать порядок через крошечные интерфейсы. И, как упоминалось ранее, одно приложение не повредит другому, «сломав» данные.

Две последние вещи - когда я говорю «сервис-ориентированное промежуточное программное обеспечение», я не имею в виду какую-то шумиху. Как я уже писал ранее, SELECT и UPDATE должны быть на уровне БД. «Промежуточное программное обеспечение» или «бизнес-уровень» (независимо от того, как вы это называете) должны быть в большей степени ориентированы на бизнес. На самом деле, веб-сервисы и WCF - это всего лишь инструменты. Независимо от того, как вы это сделаете - это можно сделать с помощью WCF, J2EE, PHP, WS- *, Borland Delphi или даже чистого C. Какая технология вы будете использовать, учитывает имеющиеся у разработчиков ресурсы, кривую обучения технологии, масштабируемость и ваши другие потребности. Но я думаю, что это должно быть сделано через какую-то сеть, и этот бизнес-уровень должен располагаться близко к базе данных.

Я надеюсь, что это также относится к вашему последнему размышлению о необходимости что-то сделать с вашими пятью приложениями в случае изменения БД. Посмотрите - необходимость изменения БД должна исходить из бизнес-потребностей. Если вам нужно сохранить некоторую дополнительную информацию - вам придется перепроектировать ее бизнес-сервис и, возможно, добавить некоторые поля в БД. Вам придется изменить базу данных и ваш бизнес-сервис. Существует большая вероятность того, что вам не придется изменять свои пять приложений, если вы разумно проектируете бизнес-уровень. Например, представьте, что вы захотите рассчитать оценку клиентов и использовать ее внутри себя, чтобы рассчитать хорошее предложение для ваших лучших клиентов - в таком случае вы, скорее всего, добавите одно поле в БД и измените некоторые услуги (добавьте службу для расчета оценки и измените расчет предложения сервис) без необходимости менять графический интерфейс. Однако, если однажды вы придете к выводу, что имя и адрес клиента слишком мало, и вы хотите собрать все его образовательные, здоровые, семейные, брачные, криминальные и кредитные данные - вам нужно будет не только изменить БД, но и изменить бизнес-уровень и предоставить пользователям ваших пяти приложений десятки новых экранов ввода для сбора таких данных ...

0 голосов
/ 04 августа 2009

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

Вот интересное чтение: http://devlicio.us/blogs/casey/archive/2009/05/14/commercial-suicide-integration-at-the-database-level.aspx

Мне еще предстоит услышать, как опытные БД говорят мне, что они предпочитают несколько баз данных.

0 голосов
/ 04 августа 2009

Изолируйте ваши данные с помощью

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

  • Сервис-ориентированное промежуточное ПО до
    обеспечить контроль за использованием BUSSINES данных

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

0 голосов
/ 04 августа 2009

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

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

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

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

Если одному приложению нужны данные из другого приложения, есть 3 способа сделать это:

  • Сервис из кода для доставки данных
  • Копировать данные поверх
  • Связанные таблицы

Это очень ясно даст понять, какому приложению принадлежат какие данные.

0 голосов
/ 04 августа 2009

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

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

0 голосов
/ 04 августа 2009

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

Если, OTOH, вы имеете в виду «версия 2 приложения № 5 в настоящее время разрабатывается и ей нужна новая структура базы данных, которая разбивает приложения с 1 по 4, находящиеся сейчас в производстве», ответ «вы не можете - и не должны» не делай этого ". Изменения в вашей базе данных должны быть чисто инкрементными. Вероятно, имеет смысл иметь общий уровень «API», общий для всех приложений, который обеспечивает общую функциональность, необходимую им всем из базы данных, и использовать для этого управление версиями API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...