Есть веские причины не использовать ORM? [закрытый]
во время моего ученичества, я использовал NHibernate для некоторых небольших проектов, которые я в основном кодировал и разрабатывал самостоятельно. Теперь, прежде чем начать какой-то более крупный проект, возникла дискуссия о том, как проектировать доступ к данным и использовать ли слой ORM. Поскольку я все еще нахожусь в своем ученичестве и все еще считаю себя новичком в корпоративном программировании, я действительно не пытался подтолкнуть, на мой взгляд, что использование объектно-реляционного картографа в базе данных может облегчить развития довольно много. Другие кодеры в команде разработчиков намного опытнее меня, поэтому я думаю, что буду просто делать то, что они говорят. : -)
тем не менее, я не совсем понимаю две основные причины не использовать NHibernate или аналогичный проект:
- можно просто построить свои собственные объекты доступа к данным с помощью SQL-запросов и скопировать эти запросы из Microsoft SQL Server Management Studio.
- отладка ОРМ может быть трудный.
так что, конечно, я мог бы просто построить свой уровень доступа к данным с большим количеством SELECT
S и т. д., Но здесь я упускаю преимущество автоматических соединений, ленивых прокси-классов загрузки и более низких усилий по обслуживанию, если таблица получает новый столбец или столбец переименовывается. (Обновление многочисленных SELECT
,INSERT
и UPDATE
запросы против обновления конфигурации сопоставления и, возможно, рефакторинга бизнес-классов и DTOs.)
кроме того, с помощью NHibernate вы можете столкнуться с непредвиденными проблемы, если вы не знаете рамки очень хорошо. Это может быть, например, доверие к таблице.hbm.xml, где вы устанавливаете длину строки для автоматической проверки. Однако я также могу представить себе подобные ошибки в "простом" уровне доступа к данным на основе запросов SqlConnection.
наконец, являются ли эти аргументы, упомянутые выше, действительно веской причиной не использовать ORM для нетривиального корпоративного приложения на основе базы данных? Есть ли, вероятно, другие аргументы, которые они / я могли бы иметь пропустили?
(Я должен, вероятно, добавить, что я думаю, что это похоже на первое "большое" приложение на основе .NET/C#, которое потребует совместной работы. Хорошие практики, которые считаются довольно нормальными при переполнении стека, такие как модульное тестирование или непрерывная интеграция, здесь до сих пор не существуют.)
10 ответов:
в последние годы произошел взрыв роста с ORMs, и ваши более опытные коллеги все еще могут думать в менталитете "каждый вызов базы данных должен проходить через хранимую процедуру".
зачем ОРМ сделать вещи более трудным для отладки? Вы получите тот же результат, независимо от того, исходит ли он из сохраненного proc или из ORM.
Я думаю, что единственный реальный ущерб, который я могу придумать с ORM, заключается в том, что модель безопасности немного меньше гибкий.
EDIT: Я просто перечитал ваш вопрос, и похоже, что они копируют и вставляют запросы в встроенный sql. Это делает модель безопасности такой же, как и ORM, поэтому не было бы абсолютно никакого преимущества над этим подходом по сравнению с ORM. Если они используют непараметризованные запросы, то это фактически будет угрозой безопасности.
короткий ответ-да, есть действительно веские причины. На самом деле есть случаи, когда вы просто не можете использовать ORM.
дело в том, что я работаю в крупном финансовом учреждении предприятия, и мы должны следовать многим рекомендациям по безопасности. Чтобы соответствовать правилам и предписаниям, которые на нас накладываются, единственный способ пройти аудит-это сохранить доступ к данным в рамках хранимых процедур. Теперь некоторые могут сказать, что это просто глупо, но честно это не так. Используя средство ORM означает инструмент/разработчик может вставлять, выбирать, обновлять или удалять все, что он или она хочет. Хранимые процедуры обеспечивают гораздо большую безопасность, особенно в средах при работе с клиентскими данными. Я думаю, что это самая большая причина для рассмотрения. Безопасность.
сладкое пятно ORMs
ORMs полезны для автоматизации 95% + запросов, где они применимы. Их особая сила заключается в том, что у вас есть приложение с сильной архитектурой объектной модели и базой данных, которая хорошо работает с этой объектной моделью. Если вы делаете новую сборку и имеете сильные навыки моделирования в своей команде, то вы, вероятно, получите хорошие результаты с ORM.
вы вполне можете иметь несколько запросов, которые являются лучше сделать вручную. В этом случае не бойтесь написать несколько хранимых процедур для обработки этого. Даже если вы собираетесь переносить свое приложение на несколько платформ СУБД, зависимый от базы данных код будет в меньшинстве. Принимая во внимание, что вам нужно будет протестировать приложение на любой платформе, на которой вы собираетесь его поддерживать, немного дополнительных усилий по переносу для некоторых хранимых процедур не будет иметь большого значения для вашего TCO. В первом приближении, 98% портативный просто как хорошо, как 100% портативный, и гораздо лучше, чем запутанные и неэффективные решения в рамках ОРМ.
Я видел, что первый подход хорошо работает на очень большом (100 лет сотрудников) проекте J2EE.
где ОРМ может быть не самым подходящим
в других случаях могут быть подходы, которые подходят для приложения лучше, чем ORM. Фаулера Шаблоны архитектуры корпоративных приложений есть раздел о шаблонах доступа к данным, которые делают довольно хорошую работу по каталогизации различных подходов к этому. Некоторые примеры, которые я видел в ситуациях, когда ORM может быть неприменим:
в приложении с существенной устаревшей кодовой базой хранимых процедур вы можете использовать функционально ориентированный (не путать с функциональными языками) уровень доступа к данным для обертывания действующих sprocs. Это повторно использует существующий (и поэтому проверенный и отлаженный) доступ к данным проектирование уровня и базы данных, которое часто представляет собой довольно значительные усилия по разработке и тестированию, а также экономит на необходимости переноса данных в новую модель базы данных. Это часто довольно хороший способ обертывания Java-слоев вокруг устаревших баз кода PL/SQL или повторного таргетинга rich client VB, Powerbuilder или Delphi-приложений с веб-интерфейсами.
вариация-это когда вы наследуете модель данных, которая не обязательно хорошо подходит для отображения O-R. Если (например) вы пишете интерфейс, который заполняет или извлекает данные из внешнего интерфейса вы можете быть лучше работать direclty с базой данных.
финансовые приложения или другие типы систем, в которых важна целостность межсистемных данных, особенно если вы используете сложные распределенные транзакции с двухфазной фиксацией. Возможно, вам придется микроуправлять своими транзакциями лучше, чем ОРМ способен поддерживать.
высокопроизводительных приложений где вы хотите действительно настроить доступ к базе данных. В этом случае может быть предпочтительнее работать на более низком уровне.
ситуации, когда вы используете действующий механизм доступа к данным, например ADO.Net это "достаточно хорошо", и хорошая игра с платформой приносит большую пользу, чем ORM.
иногда данные-это просто данные - это может быть случай (например), что ваше приложение работает с "транзакциями", а не с "объектами" и что это разумный взгляд на предметную область. Примером этого может быть пакет финансовых документов, в котором имеются проводки с настраиваемыми полями анализа. Хотя само приложение может быть построено на платформе O-O, оно не привязано к одной модели бизнес-домена и может не знать гораздо больше, чем коды GL, учетные записи, типы документов и полдюжины полей анализа. В этом случае приложение не знает о модели бизнес-домена как таковой и объектной модели (за пределами книги сама структура) не имеет отношения к применению.
во-первых-использование ORM не облегчит тестирование вашего кода и не обязательно обеспечит какие-либо преимущества в сценарии непрерывной интеграции.
по моему опыту, хотя использование ORM может увеличить скорость разработки, самые большие проблемы, которые вам нужно решить, это:
- Тестирование кода
- поддержание вашего кода
решения для этих являются:
- сделать ваш код тестируемым (с помощью SOLID принципы)
- написать автоматические тесты для как можно большей части кода, как это возможно
- запускайте автоматические тесты как можно чаще
Что касается вашего вопроса, то два возражения, которые вы перечисляете, больше похожи на невежество, чем на что-либо еще.
невозможность писать запросы SELECT вручную (что, я полагаю, и является причиной необходимости копирования-вставки), похоже, указывает на то, что существует срочная необходимость в некотором обучении SQL.
есть две причины, почему я не буду использовать ORM:
- это строго запрещено политикой компании (в этом случае я бы пошел работать в другое место)
- проект очень интенсивное использование данных и использование конкретных решений поставщика (например, BulkInsert) имеет больше смысла.
обычные отказы от ORMs (в частности, NHibernate):
скорость
нет никаких причин, почему использование ORM было бы медленнее, чем ручной кодированный доступ к данным. На самом деле, из-за кэширования и оптимизаций, встроенных в него, это может быть быстрее. Хороший ORM создаст повторяемый набор запросов, для которых вы можете оптимизировать свою схему. Хороший ORM также позволит эффективно извлекать связанные данные с использованием различных стратегий выборки.
сложности
Что касается сложности, использование ORM означает меньше кода, что обычно означает меньшую сложность. Многие люди, использующие рукописный (или сгенерированный код) доступ к данным, пишут свою собственную структуру над библиотеками доступа к данным "низкого уровня" (например, пишут вспомогательные методы для ADO.Net они приравниваются к большей сложности, и, что еще хуже, они редко хорошо документированы или хорошо протестированы.
Если вы смотрите конкретно на NHibernate, то такие инструменты, как Fluent NHibernate и Linq To NHibernate, также смягчают кривую обучения.то, что меня заводит вся дискуссия ORM заключается в том, что те же люди, которые утверждают, что использование ORM будет слишком сложным/медленным/независимо от того, являются теми же самыми людьми, которые более чем счастливы, используя Linq to Sql или типизированные наборы данных. Хотя Linq to Sql-это большой шаг в правильном направлении, он все еще отстает от того, где находятся некоторые из ОРМ с открытым исходным кодом. Однако фреймворки как для типизированных наборов данных, так и для Linq to Sql по-прежнему чрезвычайно сложны, и использовать их слишком далеко от (Table=Class) + (basic CRUD) глупо трудный.
мой совет заключается в том, что если в конце дня вы не можете получить ORM, то убедитесь, что ваш доступ к данным отделен от остальной части кода, и что вы следуете совету Банды Четырех о кодировании интерфейса. Также, получите рамки впрыски иждивенчества для того чтобы сделать проводку вверх.
(Как это для разглагольствования?)
существует широкий спектр общих проблем, для которых инструменты ORM, такие как Hibernate, являются Богом-посланием, а некоторые из них являются помехой. Я не знаю достаточно о вашем проекте, чтобы знать, что это.
одна из сильных сторон Hibernate заключается в том, что вы можете говорить только 3 раза: каждое свойство упоминается в классе .hbm.xml-файл и база данных. При использовании SQL-запросов ваши свойства находятся в классе, базе данных, операторах select, INSERT, update операторы, операторы delete и весь маршалинг и unmarshalling код, поддерживающий ваши SQL-запросы! Это может стать грязным быстро. С другой стороны, вы знаете, как это работает. Вы можете отладить его. Все в порядке там, в вашем собственном слое настойчивости, а не в недрах стороннего инструмента.
Hibernate может быть плакат-ребенок для закона Спольски дырявых абстракций. Отойдите немного в сторону от проторенного пути, и вам нужно знать глубокие внутренние работы инструмента. Это может быть очень раздражает, когда вы знаете, что могли бы исправить SQL за считанные минуты, но вместо этого вы тратите часы, пытаясь уговорить свой инструмент dang на создание разумного SQL. Отладка иногда является кошмаром, но трудно убедить людей, которые там не были.
EDIT: вы можете посмотреть iBatis.NET если они не собираются поворачиваться вокруг NHibernate, и они хотят контролировать свои SQL-запросы.
EDIT 2: Вот большой красный флаг, хотя: "хорошие практики, которые рассматриваются как довольно нормальные при переполнении стека, такие как модульное тестирование или непрерывная интеграция, здесь до сих пор не существуют."Итак, эти "опытные" разработчики, что они испытали в разработке? Их безопасность работы? Похоже, что вы можете быть среди людей, которые не особенно заинтересованы в этой области, так что не позволяйте им убить ваш интерес. Вы должны быть равновесием. Устроил драку.
Я работал над одним проектом, где не использование ORM было очень успешно. Это был проект, который
- должен был быть горизонтально scalealbe с самого начала
- должны были быть разработаны быстро
- была относительно простая модель домена
время, которое потребовалось бы, чтобы заставить NHibernate работать в горизонтально разделенной структуре, было бы намного дольше, чем время, необходимое для разработки супер простого datamapper, который был в курсе нашей схемы разбиения...
Итак, в 90% проектов, над которыми я работал, ОРМ оказывал неоценимую помощь. Но есть некоторые очень специфические обстоятельства, когда я могу видеть, что не использовать ORM как лучший.
позвольте мне сначала сказать, что ORMs может сделать вашу жизнь развития проще, если она интегрирована должным образом, но есть несколько проблем, где ORM может фактически помешать вам достичь ваших заявленных требований и целей.
Я обнаружил, что при проектировании систем с высокими требованиями к производительности мне часто приходится искать способы сделать систему более производительной. Много раз я получаю решение, которое имеет тяжелый профиль производительности записи (что означает, что мы запись данных намного больше, чем мы читаем данные). В этих случаях я хочу воспользоваться возможностями, которые предлагает мне платформа базы данных, чтобы достичь наших целей производительности (это OLTP, а не OLAP). Поэтому, если я использую SQL Server, и я знаю, что у меня много данных для записи, почему бы мне не использовать массовую вставку... ну, как вы, возможно, уже обнаружили, большинство ORMS (я не знаю, есть ли даже один) не имеют возможности воспользоваться преимуществами платформы, такими как bulk вставлять.
вы должны знать, что вы можете смешивать методы ORM и non-ORM. Я только что обнаружил, что есть несколько крайних случаев, когда ORMs не может поддерживать ваши требования, и вам нужно обойти их для этих случаев.
для нетривиального корпоративного приложения на основе базы данных действительно нет оправдания не использовать ORM.
функции в сторону:
- не используя ORM, вы решаете проблему, которая уже решается неоднократно крупными сообществами или компаниями со значительными ресурсы.
- С помощью ORM, основная часть вашего уровня доступа к данным преимущества от усилий по отладке этого сообщества или компании.
поставить некоторые перспектива в аргументе рассмотрим преимущества использования ADO.NET против написания кода для разбора табличного потока данных самостоятельно.
Я видел незнание того, как использовать ORM оправдывает презрение разработчика к ORMs, например: нетерпеливая загрузка (что-то я заметил, что вы не упомянули). Представьте, что вы хотите получить клиента и все его заказы, а для них все детали заказа. Если вы полагаетесь только на ленивую загрузку, вы уйдете от своего опыта ORM с помощью мнение: "Ормы медлительны."Если вы научитесь использовать eager loading, вы за 2 минуты сделаете с 5 строками кода то, что вашим коллегам потребуется полдня на реализацию: один запрос к базе данных и привязку результатов к иерархии объектов. Другим примером может быть боль от ручного написания SQL-запросов для реализации подкачки.
возможное исключение для использования ORM было бы, если бы это приложение было платформой ORM, предназначенной для применения специализированной бизнес-логики абстракции, и предназначены для повторного использования на нескольких проектах. Однако, даже если бы это было так, вы бы быстрее приняли, улучшив существующий ORM с помощью этих абстракций.
Не позволяйте опыту ваших старших членов команды тащить вас в противоположном направлении эволюции компьютерных наук. Я профессионально развиваюсь уже 23 года, и одна из констант-это презрение к новому со стороны старой школы. ORMs - это SQL, как и язык C сборка, и вы можете поспорить, что эквиваленты C++ и C# находятся в пути. Одна строка кода новой школы равна 20 строкам старой школы.
когда вам нужно обновить 50000000 записей. Установите флаг или что-то еще.
попробуйте сделать это с помощью ORM без вызов хранимой процедуры или собственных команд SQL..
обновление 1: Попробуйте также получить одну запись с несколькими полями. (Когда у вас очень "широкий" стол). Или скалярный результат. Ормы в этом тоже отстой.
обновление 2: похоже, что бета-версия EF 5.0 обещает пакетные обновления, но это очень горячие новости (2012, Январь)
Я думаю, что, возможно, когда вы работаете на больших системах, вы можете использовать инструмент генератора кода, такой как CodeSmith, а не ORM... Я недавно нашел это: Cooperator Framework который генерирует хранимые процедуры SQL Server, а также генерирует ваши бизнес-объекты, картографы, шлюзы, lazyload и все это в C#...проверьте это out...it была написана командой здесь, в Аргентине...
Я думаю, что это посередине между кодированием весь слой доступа к данным и использовать ОЗР...