2009-07-02 3 views
2

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

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

Я всегда думал, что данные всегда должны храниться в базе данных, а не есть память приложений, которая не будет масштабироваться в любом случае. Кроме того, вредоносное воздействие на то, чтобы быть общим, вредно. Например, если мне нужно имя и адрес всех клиентов моей базы данных, SQL предоставляет мне простой способ получить его в одном запросе. С ORM мне нужно получить всех клиентов, а затем каждое имя и адрес, даже если он ленивый, он будет больше LOT.

Это то, что я думаю, но что-то из вышеперечисленного изменилось? Я вижу много ORMS, таких как Entity Framework, NHibernate и т. Д. И в последнее время они, похоже, имеют большую популярность ... Стоят ли они того? Решают ли они проблемы, описанные выше?

ответ

6

Пожалуйста, прочтите: All Abstractions Are Failed Abstractions В перспективе должно быть много вопросов.

Производительность обычно не является проблемой с ORM - и если вы действительно находите себя в ситуации, где она есть, то обычно всегда есть возможность манипулировать операциями SQL, используемыми ORM.

IMHO ORM дает вам мгновенное и огромное увеличение скорости развития. Вот почему они так популярны. И использование их правильно не заставляет вас рисовать себя в углу. Всегда есть возможность ручной настройки производительности.

Edit:

Несмотря на то, Джефф сосредотачивается на Linq для SQL все, что он говорит о абстракциях и производительности в равной степени справедливо и для NHibernate (который я знаю с лет развития реального мира приложения). IMHO следует использовать по умолчанию ORM, так как они более чем достаточно быстро для пресловутых 90% ситуаций. Чтение кода, написанного для ORM, обычно более удобно и удобочитаемо, особенно когда ваш код подбирается следующим разработчиком, который наследует ваш код. Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live. Никогда не забывай об этом парне!

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

+0

+1, так как это мой ответ (само голосование!) – dfa

+0

Я уже прочитал его, но Джефф говорит в основном о Linq to SQL там, и меня интересуют ормы. Я знаю ограничения Linq на SQL и считаю это удобным инструментом КОГДА вы знаете, как использовать его и его ограничения ... но ... могу ли я сказать то же самое об ORM? –

+0

Когда вы говорите «как правило, не проблема с ORM», вы имеете в виду, что они работают быстро или что вы не должны их использовать, если вы нацелены на производительность? –

0

Что касается любой абстракции, вам придется платить либо в виде производительности, либо утечки. Я согласен с вами в том, что вы против ORM, поскольку SQL - это чистый и элегантный язык. Я написал свои собственные небольшие рамки, которые делают это для меня, но, эй, тогда я сидел там со своей собственной ORM (но с меньшим контролем над ней, чем, например, Hibernate). Люди, стоящие за Hibernate, заявляют, что это быстро. Он должен иметь возможность выполнять около 95% работы с буровыми работами против вашей базы данных (простые запросы, обновления и т. Д.), Но дает вам свободу делать последние 5% самостоятельно, если вы хотите (вы всегда можете писать свои собственные сопоставления в особых случаях).

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

1

На стороне Ruby on Rails ActiveRecord - по существу ORM - является основой 95% приложений Rails (составленная статистика, но она находится там). Фактически, чтобы добраться до этих 95%, нам, вероятно, потребуется включить другие ORM для Rails, например DataMapper.

Абстракция протекает, и разработчик всегда может окунуться в SQL по мере необходимости. Даже если вы не используете SQL напрямую, вам нужно подумать о количестве обращений к базе данных и т. Д. Например, в ActiveRecord «нетерпевая загрузка» используется, чтобы избежать множественных ударов базы данных, поэтому вы видите такие вещи (включая связанные «автор» поле каждого сообщение в исходном запросе ... это объединение под капотом, я думаю)

for post in Post.find(:all, :include => :author) 

Дело в том, что утечки абстракции, как это делают все абстракции, но это на самом деле не точка , Чтобы решить, следует ли использовать абстракцию или нет, вы должны подумать над тем, добавит ли она или уменьшит вашу общую рабочую нагрузку. Другими словами, вы потратите больше времени на модернизацию своих концепций, чтобы сделать абстракцию, или она готова делать то, что вам нужно, без большого взлома (экономя ваше время)?

Я думаю, что абстракции, что работа являются те, которые являются зрелыми: ActiveRecord был вокруг блока тонных (равно как и Hibernate), поэтому он обеспечивает абстрактного способа залатать большинство утечек вы как правило, беспокоиться, не накладывая явно своего собственного решения на более низком уровне (т. е. без написания SQL).

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

Edit: Я не видел этого, но цитата Джеф

эта абстракция делает ли наш код на хоть немного легче писать? До понимаете? Устранение неполадок? Мы с лучше с этой абстракцией, чем у нас были без него?

описание товара примерно такой же предмет.

1

Некоторые из более современных ОРМ - действительно мощные инструменты, которые решают множество проблем реального мира. Хорошие ORM не пытаются скрыть реляционную модель от вас, но на самом деле используют ее, чтобы сделать программирование OO более мощным. Они действительно не абстракции в том смысле, что они позволяют игнорировать «низкоуровневые» детали реляционной алгебры, вместо этого они являются инструментами, которые позволяют создавать абстракции на реляционной модели и облегчать ввод данных в императивную модель, отслеживать изменения и вернуть их обратно в базу данных. Язык SQL на самом деле не дает никакого хорошего способа вытеснить общие предикаты в составные, повторно используемые компоненты для достижения абстракций уровня businesstule.

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

for name, address in session.query(Client.name, Client.address): 
    # process data 

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

potential_sales = (session.query(Client).join(Client.favorite_items) 
        .filter(Item.is_on_sale) 
        .options(eagerload(Client.assigned_salesperson))) 

Atleast для меня, намерение запроса намного быстрее, чтобы написать , более понятным и понятным при написании, а не дюжиной строк SQL.

Смежные вопросы