ORM

Поделись знанием:
(перенаправлено с «O/R mapping»)
Перейти к: навигация, поиск

ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных». Существуют как проприетарные, так и свободные реализации этой технологии.





Задача

Необходимо обеспечить работу с данными в терминах классов, а не таблиц данных и напротив, преобразовать термины и данные классов в данные, пригодные для хранения в СУБД[1]. Необходимо также обеспечить интерфейс для CRUD-операций над данными[1]. В общем, необходимо избавиться от необходимости писать SQL-код для взаимодействия в СУБД[1].

Реляционные СУБД

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

Реляционные базы данных используют набор таблиц, представляющих простые данные. Дополнительная или связанная информация хранится в других таблицах. Часто для хранения одного объекта в реляционной базе данных используется несколько таблиц; это, в свою очередь, требует применения операции JOIN для получения всей информации, относящейся к объекту, для её обработки. Например, для хранения данных записной книжки, скорее всего, будут использоваться как минимум две таблицы: люди и адреса, и, возможно, даже таблица с телефонными номерами.

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

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

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

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

Решение

Разработано множество пакетов, устраняющих необходимость в преобразовании объектов для хранения в реляционных базах данных.

Некоторые пакеты решают эту проблему, предоставляя библиотеки классов, способных выполнять такие преобразования автоматически. Имея список таблиц в базе данных и объектов в программе, они автоматически преобразуют запросы из одного вида в другой. В результате запроса объекта «человек» (из примера с адресной книгой) необходимый SQL-запрос будет сформирован и выполнен, а результаты «волшебным» образом преобразованы в объекты «номер телефона» внутри программы.

С точки зрения программиста система должна выглядеть как постоянное хранилище объектов. Он может просто создавать объекты и работать с ними как обычно, а они автоматически будут сохраняться в реляционной базе данных.

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

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

Реализации ORM

Напишите отзыв о статье "ORM"

Примечания

Ссылки

  • [www.agiledata.org/essays/mappingObjects.html Scott W. Ambler: Mapping Objects to Relational Databases: O/R Mapping In Detail]
  • [java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html Core J2EE Design Pattern: Data Access Objects]
  • [citeseer.ist.psu.edu/cis?q=object+and+relational+and+mapping+and+database Citations from CiteSeer]
  • [www.jpab.org/ JPA Performance Benchmark] — comparison of JPA ORM tools (Hibernate, EclipseLink, OpenJPA, DataNucleus]
  • [cayenne.apache.org/ Apache Cayenne].
  • Ноубл, Дж., Андерсон, Т., Брэйтуэйт, Г., Казарио, М., Третола, Р. Flex 4. Рецепты программирования. — БХВ-Петербург, 2011. — С. 548. — 720 с.

Отрывок, характеризующий ORM

Марья Дмитриевна, застав заплаканную Соню в коридоре, заставила ее во всем признаться. Перехватив записку Наташи и прочтя ее, Марья Дмитриевна с запиской в руке взошла к Наташе.
– Мерзавка, бесстыдница, – сказала она ей. – Слышать ничего не хочу! – Оттолкнув удивленными, но сухими глазами глядящую на нее Наташу, она заперла ее на ключ и приказав дворнику пропустить в ворота тех людей, которые придут нынче вечером, но не выпускать их, а лакею приказав привести этих людей к себе, села в гостиной, ожидая похитителей.
Когда Гаврило пришел доложить Марье Дмитриевне, что приходившие люди убежали, она нахмурившись встала и заложив назад руки, долго ходила по комнатам, обдумывая то, что ей делать. В 12 часу ночи она, ощупав ключ в кармане, пошла к комнате Наташи. Соня, рыдая, сидела в коридоре.
– Марья Дмитриевна, пустите меня к ней ради Бога! – сказала она. Марья Дмитриевна, не отвечая ей, отперла дверь и вошла. «Гадко, скверно… В моем доме… Мерзавка, девчонка… Только отца жалко!» думала Марья Дмитриевна, стараясь утолить свой гнев. «Как ни трудно, уж велю всем молчать и скрою от графа». Марья Дмитриевна решительными шагами вошла в комнату. Наташа лежала на диване, закрыв голову руками, и не шевелилась. Она лежала в том самом положении, в котором оставила ее Марья Дмитриевна.
– Хороша, очень хороша! – сказала Марья Дмитриевна. – В моем доме любовникам свидания назначать! Притворяться то нечего. Ты слушай, когда я с тобой говорю. – Марья Дмитриевна тронула ее за руку. – Ты слушай, когда я говорю. Ты себя осрамила, как девка самая последняя. Я бы с тобой то сделала, да мне отца твоего жалко. Я скрою. – Наташа не переменила положения, но только всё тело ее стало вскидываться от беззвучных, судорожных рыданий, которые душили ее. Марья Дмитриевна оглянулась на Соню и присела на диване подле Наташи.
– Счастье его, что он от меня ушел; да я найду его, – сказала она своим грубым голосом; – слышишь ты что ли, что я говорю? – Она поддела своей большой рукой под лицо Наташи и повернула ее к себе. И Марья Дмитриевна, и Соня удивились, увидав лицо Наташи. Глаза ее были блестящи и сухи, губы поджаты, щеки опустились.
– Оставь… те… что мне… я… умру… – проговорила она, злым усилием вырвалась от Марьи Дмитриевны и легла в свое прежнее положение.
– Наталья!… – сказала Марья Дмитриевна. – Я тебе добра желаю. Ты лежи, ну лежи так, я тебя не трону, и слушай… Я не стану говорить, как ты виновата. Ты сама знаешь. Ну да теперь отец твой завтра приедет, что я скажу ему? А?
Опять тело Наташи заколебалось от рыданий.
– Ну узнает он, ну брат твой, жених!
– У меня нет жениха, я отказала, – прокричала Наташа.
– Всё равно, – продолжала Марья Дмитриевна. – Ну они узнают, что ж они так оставят? Ведь он, отец твой, я его знаю, ведь он, если его на дуэль вызовет, хорошо это будет? А?
– Ах, оставьте меня, зачем вы всему помешали! Зачем? зачем? кто вас просил? – кричала Наташа, приподнявшись на диване и злобно глядя на Марью Дмитриевну.
– Да чего ж ты хотела? – вскрикнула опять горячась Марья Дмитриевна, – что ж тебя запирали что ль? Ну кто ж ему мешал в дом ездить? Зачем же тебя, как цыганку какую, увозить?… Ну увез бы он тебя, что ж ты думаешь, его бы не нашли? Твой отец, или брат, или жених. А он мерзавец, негодяй, вот что!
– Он лучше всех вас, – вскрикнула Наташа, приподнимаясь. – Если бы вы не мешали… Ах, Боже мой, что это, что это! Соня, за что? Уйдите!… – И она зарыдала с таким отчаянием, с каким оплакивают люди только такое горе, которого они чувствуют сами себя причиной. Марья Дмитриевна начала было опять говорить; но Наташа закричала: – Уйдите, уйдите, вы все меня ненавидите, презираете. – И опять бросилась на диван.
Марья Дмитриевна продолжала еще несколько времени усовещивать Наташу и внушать ей, что всё это надо скрыть от графа, что никто не узнает ничего, ежели только Наташа возьмет на себя всё забыть и не показывать ни перед кем вида, что что нибудь случилось. Наташа не отвечала. Она и не рыдала больше, но с ней сделались озноб и дрожь. Марья Дмитриевна подложила ей подушку, накрыла ее двумя одеялами и сама принесла ей липового цвета, но Наташа не откликнулась ей. – Ну пускай спит, – сказала Марья Дмитриевна, уходя из комнаты, думая, что она спит. Но Наташа не спала и остановившимися раскрытыми глазами из бледного лица прямо смотрела перед собою. Всю эту ночь Наташа не спала, и не плакала, и не говорила с Соней, несколько раз встававшей и подходившей к ней.
На другой день к завтраку, как и обещал граф Илья Андреич, он приехал из Подмосковной. Он был очень весел: дело с покупщиком ладилось и ничто уже не задерживало его теперь в Москве и в разлуке с графиней, по которой он соскучился. Марья Дмитриевна встретила его и объявила ему, что Наташа сделалась очень нездорова вчера, что посылали за доктором, но что теперь ей лучше. Наташа в это утро не выходила из своей комнаты. С поджатыми растрескавшимися губами, сухими остановившимися глазами, она сидела у окна и беспокойно вглядывалась в проезжающих по улице и торопливо оглядывалась на входивших в комнату. Она очевидно ждала известий об нем, ждала, что он сам приедет или напишет ей.
Когда граф взошел к ней, она беспокойно оборотилась на звук его мужских шагов, и лицо ее приняло прежнее холодное и даже злое выражение. Она даже не поднялась на встречу ему.
– Что с тобой, мой ангел, больна? – спросил граф. Наташа помолчала.
– Да, больна, – отвечала она.
На беспокойные расспросы графа о том, почему она такая убитая и не случилось ли чего нибудь с женихом, она уверяла его, что ничего, и просила его не беспокоиться. Марья Дмитриевна подтвердила графу уверения Наташи, что ничего не случилось. Граф, судя по мнимой болезни, по расстройству дочери, по сконфуженным лицам Сони и Марьи Дмитриевны, ясно видел, что в его отсутствие должно было что нибудь случиться: но ему так страшно было думать, что что нибудь постыдное случилось с его любимою дочерью, он так любил свое веселое спокойствие, что он избегал расспросов и всё старался уверить себя, что ничего особенного не было и только тужил о том, что по случаю ее нездоровья откладывался их отъезд в деревню.


Со дня приезда своей жены в Москву Пьер сбирался уехать куда нибудь, только чтобы не быть с ней. Вскоре после приезда Ростовых в Москву, впечатление, которое производила на него Наташа, заставило его поторопиться исполнить свое намерение. Он поехал в Тверь ко вдове Иосифа Алексеевича, которая обещала давно передать ему бумаги покойного.