O / R Mappers - хорошо или плохо

Сейчас я действительно разрываюсь между использованием карт O / R или просто придерживаться традиционного доступа к данным. По какой-то причине каждый раз, когда я обращаюсь к мапперам O / R, мои коллеги-разработчики съеживаются и говорят о проблемах с производительностью или о том, что они просто плохи в целом. Что мне здесь не хватает? Я смотрю на LINQ to SQL и Microsoft Entity Framework. Есть ли основания для любого из этих утверждений? Какие вещи мне нужно идти на компромисс, если я хочу использовать преобразователь O / R? Спасибо.


person Community    schedule 09.08.2009    source источник
comment
Мне нравятся те разработчики, которые тратят 80% проекта на совершенствование скрученного вручную дал из «соображений производительности», а затем выплевывают 100 тыс. Раздутых состояний просмотра конечному пользователю ... Приоритеты   -  person redsquare    schedule 09.08.2009
comment
Это должно быть вики Сообщества?   -  person Randy supports Monica    schedule 09.08.2009
comment
Этот вопрос задавали несколько раз. Просто выполните поиск по запросу «ORM», и вы найдете множество.   -  person George Stocker    schedule 09.08.2009


Ответы (8)


Сначала это покажется несвязанным ответом, но: один из моих побочных интересов - истребители времен Второй мировой войны. Все воюющие страны (США, Великобритания, Германия, СССР, Япония и т. Д.) Построили кучу разных истребителей во время войны. Некоторые из них использовали радиальные двигатели (P47, Corsair, FW-190, Zero); некоторые использовали рядные двигатели с жидкостным охлаждением (Bf-109, Mustang, Як-7, Spitfire); а некоторые использовали два двигателя вместо одного (P38, Do-335). Некоторые использовали пулеметы, некоторые использовали пушки, а некоторые использовали и то, и другое. Некоторые даже были сделаны из фанеры, если вы понимаете.

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

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

person MusiGenesis    schedule 09.08.2009
comment
Проголосовали против, потому что выбор правильного инструмента для правильной работы является таким распространенным и универсальным ответом на любой вопрос программирования. Вместо этого лучший ответ будет описывать ситуации, когда ORM подходит или не подходит. Я бы проголосовал против во второй раз, потому что использование физических аналогий для описания выбора архитектуры программы всегда терпит неудачу, если принять во внимание тонкости. Время обучения пилотов, затраты на техническое обслуживание самолетов, использование ресурсов? - person John Farrell; 09.08.2009
comment
@jfar: моя точка зрения была более общей, чем то, как вы ее, по-видимому, поняли - что люди, которые говорят, что ORM - это здорово, а другой способ - полная чушь (или наоборот), просто глупы. И не говорите, что никто этого не говорит, потому что люди здесь, на SO, постоянно говорят такие вещи. Что касается физических аналогий отказа программного обеспечения, если вы рассматриваете детали, я не люблю говорить да, поэтому не буду. - person MusiGenesis; 09.08.2009

Я долго боролся с этим решением. Думаю, я колебался по двум основным причинам. Во-первых, картографы O / R представляют собой отсутствие контроля над тем, что происходит в критической части приложения, а, во-вторых, потому, что очень много раз я был разочарован решениями, которые хороши для случая 90%, но ужасны для последнего. 10%. Конечно, все работает для избранных * от авторов, но когда вы увеличиваете сложность и получаете критически важную систему большого объема и ваша карьера находится на кону, вы чувствуете, что вам нужен полный контроль для настройки каждого шаблона запроса и байта по проводу. Большинство разработчиков, включая меня, расстраиваются, когда инструмент в первый раз подводит нас, и мы не можем делать то, что должны делать, или наши потребности отклоняются от установленного шаблона, поддерживаемого инструментом. Я, вероятно, разозлюсь за упоминание конкретных недостатков в инструментах, поэтому я оставлю все как есть.

К счастью, Андерсон Имес наконец убедил меня попробовать CodeSmith с помощью шаблона netTiers. (Нет, я не работаю на них.) Я не могу поверить, что после более чем года использования этого мы не сделали это раньше. Моя команда использует Visual Studio DB Pro, и при каждой регистрации наша сборка непрерывной интеграции выдает новый набор сборок уровня доступа к данным. Это автоматически обрабатывает все общие вещи с низким уровнем риска, но мы все еще можем писать собственные sprocs для сложных битов и включать их в качестве методов в сгенерированные классы, а также мы можем настраивать шаблоны для сгенерированного кода. Я очень рекомендую этот подход. Могут быть и другие инструменты, которые также позволяют этот уровень контроля, и есть новый шаблон CodeSmith под названием PLINQO, который использует LINQ to SQL под капотом. Мы еще не исследовали это (не нужно было), но этот общий подход имеет много достоинств.

Джерри

person Jerry Bullard    schedule 09.08.2009

Инструменты O / RM предназначены для очень хорошей работы в большинстве ситуаций. Он будет кэшировать объекты для вас, он будет выполнять массовые запросы, он имеет оптимизированный доступ к объектам на очень низком уровне, который намного быстрее, чем ручное присвоение значений свойствам, они дают вам очень простой способ включить варианты аспектно-ориентированного программирования с использованием современные технологии, такие как перехватчики, он будет управлять состоянием объекта за вас и помогать разрешать конфликты и многое другое.

Минусы этого подхода обычно заключаются в отсутствии понимания того, как все работает на очень низком уровне. Самая классическая проблема - «ВЫБРАТЬ N + 1» (ссылка ).

Я работаю с NHibernate уже 2,5 года и все еще открываю для себя что-то новое почти каждый день ...

person Ray    schedule 09.08.2009

Хорошо. В большинстве случаев.

Повышение производительности от использования ORM в большинстве случаев перевешивает потерю контроля над доступом к данным.

Не так много тех, кто избегал бы C #, чтобы программировать MSIL или Assembly, хотя это дало бы им больше контроля.

person Shiraz Bhaiji    schedule 09.08.2009
comment
+1 из-за ключевого слова: продуктивность. Я реализовал своего рода CRM-систему со сложной базой данных в MySQL. Я не могу себе представить, что мне нужно делать все сопоставления вручную каждый раз, когда меняются требования ... а это происходило примерно 50 раз. - person Victor RENÉ; 15.03.2014

Проблема, с которой я сталкиваюсь с большим количеством OR mappers, заключается в том, что вы получаете раздутые объекты домена, которые обычно сильно связаны с остальной частью вашей инфраструктуры доступа к данным. Наших разработчиков это тоже передергивает :) Просто эти объекты сложнее перенести на другую технологию доступа к данным. Если вы используете L2S, вы можете взглянуть на сгенерированный код. Похоже, полный бардак. NHibernate, вероятно, один из лучших в этом отношении. Если вы правильно их спроектируете, ваши сущности совершенно не осведомлены о вашем уровне доступа к данным.

person Community    schedule 09.08.2009
comment
На самом деле DTO - это ваш пропуск. И, да, один из их недостатков - это классовый взрыв, который они создают. - person BozoJoe; 29.09.2009

Это действительно зависит от ситуации.

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

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

on an on

Итак, проработав там несколько недель, я заметил следующее:

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

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

Кроме того, я чувствую, что многие аргументы против ORM возникают из-за незнания. Каждый ORM, который я видел, допускает настраиваемые запросы, и даже следуя соглашениям ORM, вы можете писать очень сложные и подробные запросы, которые, как правило, более удобочитаемы. Кроме того, они, как правило, очень СУХИЕ. Вы даете им свою схему, а они разбираются во всем остальном, вплоть до сопоставления отношений.

В современных ORM есть множество инструментов, которые могут вам помочь, например сценарии миграции, несколько типов БД, к которым осуществляется доступ к одним и тем же объектам, поэтому вы можете использовать преимущества как NOSQL, так и SQL DB. Но вы должны выбрать правильный ORM для своего проекта, если собираетесь его использовать.

person Jdahern    schedule 28.11.2013

Впервые я познакомился с сопоставлением ORM и уровнями доступа к данным, прочитав книгу Рокфорда Лхотка «Бизнес-объекты C #». Он провел годы, работая над структурой для DAL. Несмотря на то, что его стандартная структура довольно раздута и в некоторых случаях избыточна, у него есть несколько отличных идей. Я очень рекомендую книгу всем, кто интересуется картографами ORM. На меня его книга повлияла настолько, что я отобрал многие его идеи и встроил их в свой собственный фреймворк и генерацию кода.

person Darthg8r    schedule 09.08.2009

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

Однако возьмите LinqToSql - если вы уверены, что вам не придется отказываться от SQL Server, тогда это решает множество общих проблем, наблюдаемых в ORM mappers. Он позволяет легко добавлять хранимые процедуры (как статические методы), поэтому вы не ограничены только сгенерированным SQL. Он использует отложенное выполнение, чтобы вы могли эффективно объединять запросы в цепочку. Он использует частичные классы, чтобы вы могли легко добавлять настраиваемую логику к сгенерированным классам, не беспокоясь о том, что произойдет, когда вы их повторно сгенерируете. Также ничто не мешает вам использовать LINQ для создания собственного абстрактного DAL - это просто ускоряет процесс. Главное, однако, заключается в том, что это снижает утомительность и время, необходимое для создания базового уровня CRUD.

Но есть и минусы. Между вашими таблицами и классами будет тесная связь, будет небольшое снижение производительности, вы можете иногда генерировать запросы, которые не так эффективны, как вы ожидали. И вы привязаны к SQL Server (хотя некоторые другие технологии ORM не зависят от базы данных).

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

person Dan Diplo    schedule 09.08.2009
comment
Большинство других инструментов O / RM позволяют так же легко отображать sprocs. Чтобы назвать несколько: (N) Hibernate и EntityFramework. Также Microsoft прекратила работу над Linq2Sql, поэтому мы в значительной степени придерживались текущей реализации ... - person Ray; 09.08.2009
comment
Перестал работать с Linq2Sql? damieng.com/blog/2009/ 01.06.01 / linq-to-sql-changes-in-net-40 - person John Farrell; 09.08.2009