Инфраструктура: моделирует как внешнее приложение, чтобы избежать хранимых процедур

Мои мысли:

Я абсолютно презираю хранимые процедуры по разным причинам: стоимость, масштабируемость и совместимость.

  • Стоимость: я могу получить 2-3 хороших облегченных сервера веб-приложений по цене одного хорошего сервера MySQL.

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

  • Совместимость: в какой-то момент хранимая процедура list_foo_widgetsByUser() может не соответствовать потребностям клиента #123. Было бы самоубийством изменять сигнатуру list_foo_widgetByUser()... так что тогда мне нужно было бы написать новый sproc cl123_list_foo_widgetByUser(), и это привело бы к maddness или убийству DBA.

Мое решение:

Извлеките модели из репозитория приложения и поместите их во внешнее хранилище. Тогда каждое приложение будет иметь подкаталог models/Base, который указывает на внешний репозиторий. Затем поместите перед собой простой фабричный метод, такой как GetModel("FooWidgets"), который будет возвращать класс baseFooWidget как экземпляр или дочерний экземпляр приложения. Это позволило бы отдельным приложениям наследовать класс FooWidget или в сочетании с таким инструментом, как Liquabase, обеспечить большую базу изменчивости.

Голос в затылке говорит, что это слишком просто... что мне здесь не хватает?

Ссылки: Я точно знаю, что среда PHP Kohana делает что-то в этом роде, чтобы позволить дизайнерам приложений обернуть базовую библиотеку Kohana дополнительными функциями, и если PHP может это сделать, я не вижу проблем с любым другим языком.

1 ответ

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

PHP, с другой стороны, не позволяет легко структурированную упаковку. Я не являюсь наркоманом PHP (скорее, парень из C# / Java), но лучший способ справиться с этим - отдельные уровни базы данных / домена / доступа / бизнеса. Короче:

  1. Внизу: база данных. Просто таблицы, отношения и все тут.
  2. Затем вам нужно отображение: простые объекты, которые представляют ваши таблицы. Обычно один объект на таблицу.
  3. Далее вам нужны методы для работы с этими объектами. Большинству таблиц понадобятся методы get all, get by id и save. В идеале, они идут в отдельный модуль, поэтому его можно разрабатывать без необходимости изменения отображения.
  4. Наконец, вам нужна ваша бизнес-логика, которая может перейти на отдельный уровень или в ваше приложение.

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

Инструментами, которые могут помочь вам в этом процессе, являются Hibernate (но тогда вам нужен JavaBridge), это инструмент ORM, но он имеет немного крутой кривой обучения. Для PHP кажется, что Doctrine может многое сделать для вас. Существуют и другие инструменты. В идеале, инструмент позволяет проектировать в обоих направлениях: если вы что-то меняете, вы снова запускаете инструмент (или что-то меняете) и не ломаете приложение.

Другие вопросы по тегам