Каковы преимущества использования абстракции базы данных ORM? [закрыто]


19

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

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

Что если я знаю, что в течение долгого времени я не буду переключать основную базу данных? Почему бы также не получить доступ к функциям базы данных?


2
+1: очень интересно. Я обычно был сторонником ORM, но я обычно считал RDBMS равными (что я недавно начал считать неправильным).
Стивен Эверс

Похоже, вы просто хотите подтвердить свое мнение; блог может подойти вам лучше, чем сайт вопросов и ответов.

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

Ответы:


14

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

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

IMO любой ORM, у которого нет этой функции, не стоит тех битов, из которых он скомпилирован.


drops it directly into the query it's generatingЗвучит интересно. Вы знаете, сколько времени вам понадобилось, чтобы написать эту доморощенную ОРМ? Я хотел бы увидеть что-то подобное в одном из открытых источников ORM.
2010 г.

+1. Работа с наиболее важным аспектом моего приложения (данных) - это последнее, что я хочу абстрагировать и потерять связь.
Фоско

1
Мне нравится, когда я могу нырнуть, когда это необходимо, при условии, что это погружение включает в себя пересечение метафорического забора: «Вот будь драконами. Следи за своим шагом».
Фрэнк Шиарар

1
@Jblue: Понятия не имею. Все было написано много лет назад, задолго до того, как меня наняли. Они создали ORM, прежде чем кто-либо использовал этот термин. Обычно это называется просто «объектная модель» в нашей кодовой базе.
Мейсон Уилер

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

14

ОРМ принимает наименьший общий знаменатель

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

Краткое примечание: вы упоминаете только абстракцию базы данных. Это одно из многих преимуществ, но я действительно считаю, что объектно-ориентированные функции более мощные (например, наследование). И You design your domain model first...

... Вернуться к абстракции. Это не самый низкий общий знаменатель. В nHibernate у вас есть диалекты. Это позволяет использовать один и тот же код для запроса разных баз данных. Диалекты позаботятся о функции управления для вас. Правильное утверждение таково a given dialect will try to use all the power of a given database system.

В качестве примера возьмем SqlServer2005диалект, который при внедрении использовал преимущества новых функций подкачки SQL Server 2005. Использование этого диалекта вместо того, чтобы SqlServer2000просто повысить ваши выступления.

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


+1 за пропаганду NHibernate. Немного кривой обучения по сравнению с другими ORM, но усилия того стоят.
Ричейм

1
Я хотел бы услышать об этом от некоторых администраторов баз данных. На моей последней работе Hibernate был не чем иным, как проблемой (SQL, который он генерировал, был просто отвратителен).
Fosco

+1 за этот комментарий. Это место. Когда вы начнете сравнивать возможности хорошего ORM, такого как nHibernate (с кэшированием, отложенной загрузкой и т. Д.), Вы поймете, почему эта абстракция хороша и почему ваши потребности в базе данных менее важны.
Крис Холмс

1
Fosco, дай nHibernate еще один шанс. Как и любой другой технолой, вы должны понимать, что происходит внутри, чтобы правильно его использовать.

+1, ORM - это максимальное пересечение того, что может делать Java с тем, что может делать конкретный драйвер JDBC. Вы можете выбрать сумму инвестиций, которую вы хотите сделать, в постоянном слое вашего приложения
bobah

5

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

Итак, я думаю, что вопросы должны быть, прежде чем перейти к одному:

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

И потом, будет ли дополнительный уровень абстракции оказывать негативное влияние на приложение? Будет ли он медленнее, чем SQL, написанный вручную?


5

O / RM регулярно подвергается критике. Тед Ньюард назвал это « Вьетнамом информатики » несколько лет назад. O / RM

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

Если вы просто не напишите свое собственное специальное отображение (которое во многих случаях является хорошим решением, как уже говорили другие), вы можете рассмотреть альтернативы, такие как использование нереляционной базы данных. Некоторые говорят, что действительно объектная база данных лучше, другие умные слова, упомянутые в этом контексте, это LINQ, Ruby и Tutorial D. Я полагаю, что в отличие от действительно реляционных баз данных, существуют действительно объектные базы данных. Но на практике я обнаружил, что концептуальное моделирование данных - то есть выяснение, о каких объектах реального мира вы хотите хранить данные и как эти объекты связаны друг с другом - важнее, чем выяснить, как выразить вашу концептуальную модель в любом язык программирования или базы данных.


2
Здорово читать там. Я прошел полный круг в карьере и переосмыслил реляционную модель с полным успехом.
Jé Queue

2
+1 @Xepoch - у меня недавно был рассказ о face re: ORMs - почему SQL не используется? Абстракция, конечно - но ORM, кажется, способствует фобии SQL.
Sunwukung

1
@sunwukung, я не всегда соглашался, но теперь я верю, что SQL следует считать логическим уровнем 1-го класса, а не просто чем-то, что используется в качестве проводного протокола.
Jé Queue

3

Какая альтернатива?

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

В конце дня вы должны спросить себя - какая альтернатива?

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


Я бы поставил под сомнение необходимость использования рациональной базы данных вообще. Меня беспокоит, что люди сразу же переходят на RDBMS, даже если они не являются правильным решением. Например, объектные базы данных обеспечивают очень элегантное решение многих проблем. Они идеальны? Нет, но люди редко пытаются их оценить. Существует тревожная тенденция: «Мне нужно хранить данные, я буду использовать SQL!»
Мэтт Оленик

6
@Matt: RDBMS - очень проверенная и проверенная технология. Есть множество людей с опытом работы с ними и большое количество сторонних инструментов. С точки зрения предприятия, есть большая ценность, когда вы имеете дело с чем-то чрезвычайно ценным, например, с вашими данными. В небольших проектах по-прежнему важно иметь возможность запускать проект (например, веб-сервис LAMP) и иметь большую часть программного обеспечения и хорошо документировать его.
Дэвид Торнли

3

ORM в основном равносильно « несохраненным процедурам ». Там я придумал термин.

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

Но, как обычно, все зависит от приложения и поставленной задачи.


2
«Незарегистрированные процедуры» - правильный термин «параметризованный SQL». Вы только царапаете поверхность того, что зрелый ORM может сделать для вас (пакетирование, ленивая загрузка и т. Д.)
Ричейм

@richeym: большинство ORM в PHP не используют ни подготовленные операторы, ни параметризованные заполнители. Это SQL-экранирование и конкатенация. Конечно, они предоставляют преимущества более высокого уровня по сравнению с утомительными ручными SQL-запросами. Однако, по отдельности, они убирают логику обработки из базы данных, следовательно, «не сохраненные процедуры».
Марио

3

Одна вещь, которая вредит использованию ORM, заключается в том, что многие их поклонники утверждают, что нам больше не нужно знать теорию SQL и RDB. Результаты варьируются от забавных до совершенно катастрофических. И это несмотря на то, что миллионы раз ORM 'производят и утверждают, что мы должны хорошо знать теорию SQL и RDB, чтобы правильно использовать и настраивать ORM.

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


1

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

Благодаря ORM ( Propel , в PHP) мы разделили некоторую логику кода, поэтому одна функция добавила часть запроса «is record valid», а другая часть безопасности («показывать эти записи только в том случае, если пользователь имеет эти возможности "), ... Если базовая структура изменилась (дополнительное поле, которое следует учитывать для" достоверности записи "), нам нужно было изменить только одну функцию, а не двадцать предложений SQL.

Мы пришли из ситуации, когда все (ну, большинство) предложений SQL были сохранены в отдельном XML-файле, поэтому «изменения базы данных будут легко обрабатывать». Поверьте мне, они не были. Одна часть была настолько ужасной, что мне пришлось представить ее в The Daily WTF .

Если запрос был слишком сложен для выражения с помощью Propel Criteria, или нам нужны были некоторые специфические для поставщика функции (в основном, полнотекстовый поиск, так как мы использовали MySQL), это не было проблемой для Propel. Вы можете добавить пользовательские критерии , или, когда это действительно необходимо, мы использовали сырой SQL ( теперь еще проще комбинировать с реальными объектами Propel). Вы можете легко добавить свои специфичные для поставщика надстройки в сгенерированные классы, чтобы у вас было лучшее из обоих миров: в коде приложения нет SQL, но есть все возможности вашего механизма базы данных.


1

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

Я сейчас работаю в C # и много использую LINQ, поэтому очень много беглых методов. Мне не нужно думать о том, как мои объекты хранятся или обнаруживаются, или даже сохраняются на уровне программы, и очень мало на уровне бизнес-уровня.

Довольно часто методы, предоставляемые самими определенными базами данных, используются в коннекторе БД, поэтому вы получаете эти оптимизации, не зная, что это такое.

Вы все еще можете написать функции DB-стороне. Часто вы можете просто отобразить их.

И, прежде всего, такое разделение позволяет тестируемость и заставляет вас (немного) писать более структурированный код


2
Опять же, зачем вам программировать вне базы данных? Почему бы не сделать базу данных неотъемлемой частью вашей разработки, поскольку вы решили использовать ее в первую очередь. Если вам не нужна RDBMS, зачем использовать ORM?
Jé Queue

1
Это неотъемлемая часть. База данных очень хорошо справляется с поддержанием и обеспечением отношений и извлечением необработанных данных. Однако то, что вы хотите сделать с этими данными, скорее всего, уже было обработано в оболочке ORM. И кроме критических вещей, зачем убирать логику из бизнес-уровня?
burnt_hand

@burnt_hand - «Но дело в том, что вы можете программировать вне базы данных, то есть вам не нужно думать так, как будто вы находитесь в базе данных». Каковы универсальные преимущества? Я вижу в этом преимущество, когда ваше приложение просто ищет способ сохранения объектов. Но для реляционных данных, OLTP и т. П. Программирование вне базы данных - это один из способов запутаться.
luis.espinal

@ luis.espinal - что значит крушение себя? мне искренне любопытно У вас есть пример?
burnt_hand

@burnt_hand - на самом деле у меня есть несколько реальных примеров. Самый последний из них связан с очень большой моделью домена, и для повышения производительности проект должен загружать все отображения гибернации при запуске. Получающаяся фабрика сеанса заканчивает тем, что съела до 30% используемой памяти ... только для привязок. Кодовая база теперь слишком согласована с ORM, и ее невозможно переписать. Это теперь имеет реальные последствия, поскольку приложение приближается к физическим ограничениям на оборудование, на котором оно должно было работать. Облом.
luis.espinal

1

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

Например, в текущем проекте, над которым я работаю, мы используем Java Persistence API и Hibernate. Тем не менее, мы используем несколько специфических функций базы данных, таких как поиск в таблицах с soundex.

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

Тем не менее , в какой-то момент вам, скорее всего, придется все равно подумать об этом, в зависимости от требований вашего приложения. ОРМ не волшебство.


1

Я написал свой собственный, который помогает мне легче делать выборки и вставки.

Evey db конкретная вещь доступна. Мне просто нужно написать запрос, с которым мне помогает библиотека (я могу использовать «?» И params вместо того, чтобы вручную называть параметр и использовать .Add)

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


1

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

Они стандартизированы, универсальны, либо указаны, либо являются общими. Кроме того, его быстрее и проще в реализации. Я использовал subsonic, linq-to-sql и структуру сущностей. Это позволяет разработчику сосредоточиться на логике и бизнес-правилах вместо отображения базы данных.


1
Есть много причин использовать или НЕ использовать ORM. ОРМ не являются панацеей, и мало кто знает, как эффективно их использовать. Кроме того, во многих случаях бизнес-логика уже отчасти отражается (частично) очень естественным образом в отношениях, уже существующих в СУБД (это был самый распространенный сценарий, с которым я сталкивался, в прошлом и настоящем). Хорошо разработанная RDBM имеет прочную, хорошо понятную, проверенную и обоснованную математическую основу. Конечно, не все должно моделироваться с помощью RDMB, но в равной степени ORM также не является универсальным решением.
luis.espinal

1

Мои (простые) два цента:

1: есть ORMS и есть ORMS. Некоторые ORMS основаны на Active Record, другие основаны на Data Mapper - это само по себе является важным фактором, но требует понимания, чтобы понять последствия. В целом, мой опыт в PHP заключается в том, что ORMS поддерживают первое, немногие поддерживают второе. ORM на основе Active Record, по-видимому, имеют один из двух эффектов: они либо нормализуют базу данных, либо вызывают множество классов для поддержки взаимодействия объектов.

2: Преимущество ORM уменьшается в прямой зависимости от сложности запроса, который вам нужно выполнить. Когда у вас хорошие приятные отношения - например, Пользователи -> Сообщения, они могут работать очень хорошо. Это (IMO), поэтому большинство ORM / каркасов используют подобные примеры. Однако, когда вам нужно выполнить сложные запросы, объем ORMQL, который вам нужно сгенерировать, сопоставим с длиной строки обычного запроса SQL - но менее производительный из-за того, что граф объектов, запускающий запрос, вызывает, что побеждает точку абстракция. Итак, в двух словах - ORM великолепны для первых 30-50% задач вашей базы данных - но ужасны для последних. Я думаю, что это еще одна причина, почему AR так распространен.

3: зачем прятаться от базы данных? Вы бы использовали язык на стороне сервера для абстрагирования JavaScript?

Лично я смешиваю эти подходы:

  • используйте ORM для основ, загружая "пользователей"
  • используйте DAO, содержащий несколько предварительно запеченных SQL-запросов (т.е. selectLike, selectWhere).
  • расширить DAO, где это необходимо, чтобы добавить более конкретные, но повторно используемые пользовательские запросы
  • Обеспечьте простой доступ к базе данных через DAO - то есть $ data = Dao-> запрос (ваша строка sql) для выполнения однократных запросов.

Сказав все это, Doctrine 2 скоро выйдет, что выглядит действительно интересно.


0

Вы можете использовать SQL Mapper Frameworks, такие как myBatis, если вы хотите использовать функции SQL.


Это не совсем ответ на вопрос jblue о преимуществах использования такого картографа
Лукас Эдер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.