ORM против уровня доступа к данным с ручным кодированием - PullRequest
19 голосов
/ 19 февраля 2009

Я немного боюсь задать этот вопрос, так как это может привести к религиозной войне, поэтому я хочу быть действительно ясным в том, что я ищу. Я ищу причину (-ы), по которой вы бы прыгнули в ту или иную сторону, а также элементы, которые можно добавить в мои списки. Я ищу большой билет, большой взрыв. Кроме того, предметы, специфичные для продукта, может быть, если они действительно актуальны. На данный момент я пытаюсь оценить ORM vs Manual, а не продукт A против продукта B.

Преимущества ORM

 - Quick to code and low maintenance (in some/most scenarios) 
 - Additional features for "free" (no developer effort)

Преимущества ручного кодирования

 - More Efficient (at runtime, maybe not at dev time?)
 - Less layers of complexity
 - Most ORMS seem to struggle with being retricted to sprocs only

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

Наверное, также стоит отметить, что я нахожусь в мире .Net

[править] (вопрос на Использование ORM или простого SQL? , кажется, отвечает на многие вопросы и усиливает точку зрения на производительность)

Итак, чтобы немного изменить мой вопрос

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

[Дальнейшее редактирование - теперь суть проблемы] Наличие веб-сайта, способного выполнить любой SQL для моей базы данных, пугает. Если весь доступ осуществляется через sprocs, моя база данных живет в хорошей, безопасной и удобной изоляции. Использование исключительно sprocs удаляет многие, если не все векторы атаки SQL-инъекций. Любые комментарии по этому поводу?

Ответы [ 16 ]

1 голос
/ 19 февраля 2009

Сохраненные Procs не снимают риск инъекции SQL. Человек, который может объединять запросы в коде, также может делать это и в хранимых процессах. И любой хороший ORM в любом случае не выполняет конкатенацию строк, поэтому проблем нет.

0 голосов
/ 11 июля 2009

Я был ОЧЕНЬ успешен, просто используя DataSets в .Net. У нас есть конечная точка SOAP, которая сначала проверит ввод с помощью .XSD. Затем вы можете использовать механизм правил для проверки. Тогда ...

Если запрос на вставку данных:

  • Используйте GetXml () в наборе данных для преобразования в XML.
  • Отправьте XML в sproc, который использует OPENXML в SQL Server.

Если запрос состоит в выборе данных:

  • Напишите sproc, чтобы выплевывать данные с помощью нескольких операторов SELECT.
  • Загрузите эти данные в DataSet (обязательно создавая «вложенные» отношения там, где это необходимо).
  • Используйте GetXml () в DataSet для преобразования в XML, используемый в SOAP.

Я использовал этот процесс с большим успехом в нескольких производственных средах. Это быстро и просто, если вы знаете, что будете использовать только SQL Server.

0 голосов
/ 27 апреля 2009

Хорошо, это было для приложения PHP, а не для .net, но я думаю, что важны те же качества.

Несколько лет назад я переписал приложение для интрасети PHP, основанное на базе данных. Как это характерно для многих PHP-приложений, которые «только что выросли», они не использовали какой-либо ORM и имели много дублированного кода, большая часть которого собирала похожие запросы разными способами.

Я бегло посмотрел на некоторые фреймворки ORM, но у них всех была большая проблема: им потребовалось бы настроить их для работы в нашей структуре. Большим отсутствующим компонентом была масштабируемость базы данных. Поэтому я написал свой собственный обработчик. Тогда было просто продолжать идти и создавать собственный объектный уровень данных. Мы получили возможность реализовывать функции, которые хотели, и делали то, что нам нужно.

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

0 голосов
/ 27 апреля 2009

хороший вопрос и хорошие ответы. Я только что занялся этими вопросами. Я предпочитаю ORM, такой как SubSonic, кодировать вручную DAL.

0 голосов
/ 19 февраля 2009

Я использовал реализацию активной записи Castle Project с NHibernate для личного проекта. Проект никогда не развертывался, отчасти из-за моей неспособности работать с выбором ORM, который я сделал.

Причина, по которой я решил использовать ORM, заключалась в том, что я хотел иметь возможность переключаться с SQL Server на MYSQL без изменения своего кода. В реальных проектах решение об использовании SQL-сервера уже принято за меня, и проще просто записывать слои данных традиционным трехуровневым способом, когда вы знаете, что база данных не изменится. Но для личных проектов я использую виртуальный хостинг, и MySQL - более дешевое решение.

Причина, по которой я пошел с Каслом, заключалась в том, что им было очень легко пользоваться. С помощью плагина activewriter для Visual Studio я смог сгенерировать свои классы и базу данных, используя конструктор (вроде как linq to SQL designer), и он, казалось, хорошо вписывался в мою ментальную модель того, как ORM должен диктовать архитектуру вашего приложения. .

Проблема с ORM, с которой я столкнулся, заключалась в том, что я не смог найти информацию о том, как правильно его оптимизировать. Он делал очень большие звонки в базу данных. (SQL-запрос, сгенерированный для получения пользователя, составлял 1 МБ текста, когда я его регистрировал.)

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

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

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

0 голосов
/ 19 февраля 2009

Вам не нужно отказываться от своих SPROC или созданного вручную SQL с хорошим ORM, таким как nHibernate.

После этого я заменил свои методы доступа к данным ORM, это совсем не сложно, это лучшее из обоих миров.

...