Самодельная модель SQL против ORM? - PullRequest
1 голос
/ 06 октября 2011

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

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

У меня такой вопрос:

Стоит ли внедрять ORM (Doctrine2или Propel), или я должен ограничиться написанием классов моделей с нуля (аналогично шаблону ActiveRecord, групповым методам / запросам по таблице и записи, поэтому у каждого объекта есть два связанных класса)?

основными целями являются:

  1. производительность приложения,

  2. удобство чтения и модификации кода / запросов и

  3. простота возможной модификации БД (подробности).

Лично я предпочитаю второй выбор;Есть довольно сложные запросы SQL, я сомневаюсь, что ORM сможет поддерживать абстракцию БД для всех запросов.Начальная разработка завершена, и нет необходимости в быстрой скорости разработки кода / кода запроса.Нам гораздо важнее, чтобы мы могли легко читать, понимать и изменять код / ​​запросы.

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

1 Ответ

1 голос
/ 26 июля 2012

Структурирование вашего кода определенно поможет вам со 2 и 3, и если все сделано правильно, 1 тоже не пострадает. Поскольку вы включаете сторонние ORM, вам будет легче добиться хорошей производительности, поскольку такие функции поддержки ORM, как кэширование и отложенная загрузка «из коробки».

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

Я бы сказал, что хорошим способом использования ORM сторонних разработчиков является организация вашего существующего кода и запросов аналогичным образом. Итак, вы можете ввести класс ProductRepository, который имеет метод find (), инкапсулирующий существующий запрос, и возвращает ResultSet. Далее следует ввести класс данных продукта (класс только с полями и без методов). Класс продукта должен отображать таблицу Product в БД. Теперь find должен вернуть массив Products. Метод find () теперь сначала преобразует ResultSet в массив Products и возвращает массив. Код клиента должен быть изменен соответствующим образом. Наконец, вы начинаете заменять ваши пользовательские запросы внутри метода find () делегированием в ORM. Клиенты, использующие репозиторий, не должны обнаруживать изменения. Класс данных Product является семенем слоя модели. По мере продвижения вы можете добавить к нему поведение и создать слой реального домена.

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

Я бы подошел к этому следующим образом:

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

Внедрение полноценного многоразового использования ORM - большая работа, поэтому я предлагаю вам включить существующий и начать вводить его небольшими шагами.

Я описал этот подход довольно подробно в моей книге «Профессиональный рефакторинг в C #», и вы можете загрузить образец кода, который проведет вас через здесь .

...