Объектно-реляционное отображение ( ORM , O/RM и O/R mapping tool ) в информатике — это метод программирования для преобразования данных между реляционной базой данных и памятью (обычно кучей ) объектно -ориентированного языка программирования. Это, по сути, создает виртуальную объектную базу данных , которую можно использовать из языка программирования.
В объектно-ориентированном программировании задачи управления данными действуют на объекты , которые объединяют скалярные значения в объекты. Например, рассмотрим запись адресной книги, которая представляет одного человека вместе с нулем или более телефонных номеров и нулем или более адресов. Это может быть смоделировано в объектно-ориентированной реализации с помощью « объекта Person » с атрибутом/полем для хранения каждого элемента данных, который содержит запись: имя человека, список телефонных номеров и список адресов. Список телефонных номеров сам по себе будет содержать «объекты PhoneNumber» и так далее. Каждая такая запись адресной книги рассматривается языком программирования как отдельный объект (например, на нее может ссылаться одна переменная, содержащая указатель на объект). С объектом могут быть связаны различные методы , такие как методы для возврата предпочтительного номера телефона, домашнего адреса и так далее.
Напротив, реляционные базы данных, такие как SQL , группируют скаляры в кортежи , которые затем перечисляются в таблицах . Кортежи и объекты имеют некоторое общее сходство, поскольку они оба являются способами сбора значений в именованные поля, так что всей коллекцией можно манипулировать как единой составной сущностью. Однако у них есть много различий, в частности: управление жизненным циклом (вставка и удаление строк, в отличие от сборки мусора или подсчета ссылок ), ссылки на другие сущности (ссылки на объекты, в отличие от ссылок на внешние ключи) и наследование (отсутствующее в реляционных базах данных). Кроме того, объекты управляются в куче и находятся под полным контролем одного процесса, в то время как кортежи базы данных являются общими и должны включать блокировку, слияние и повтор. Объектно-реляционное отображение обеспечивает автоматизированную поддержку отображения кортежей в объекты и обратно, при этом учитывая все эти различия. [1]
Суть проблемы заключается в переводе логического представления объектов в атомизированную форму, которая может храниться в базе данных, сохраняя при этом свойства объектов и их взаимосвязи, чтобы их можно было перезагружать как объекты при необходимости. Если эта функциональность хранения и извлечения реализована, то объекты считаются постоянными . [1]
Детали реализации драйверов хранения данных обычно заключены в API на используемом языке программирования, предоставляя методы для взаимодействия с носителем данных более простым и соответствующим парадигмам окружающего кода способом.
Ниже приведен простой пример, написанный на языке C# , для выполнения запроса, написанного на языке SQL, с использованием ядра базы данных.
var sql = "SELECT id, first_name, last_name, phone, birth_date, sex, age FROM persons WHERE id = 10" ; var result = context.Persons.FromSqlRaw ( sql ) .ToList ( ) ; var name = result [ 0 ] [ " first_name" ];
Напротив, в следующем примере используется API ORM-задания, что позволяет писать код, который естественным образом использует возможности языка.
var person = repository.GetPerson ( 10 ) ; var firstName = person.GetFirstName ( ) ;
В приведенном выше случае используется объект, представляющий хранилище и методы этого объекта. Другие фреймворки могут предоставлять код в виде статических методов, как в примере ниже, а другие методы могут вообще не реализовывать объектно-ориентированную систему. Часто выбор парадигмы делается для наилучшего соответствия ORM принципам дизайна окружающего языка.
вар человек = Человек . Получить ( 10 );
По сравнению с традиционными методами обмена между объектно-ориентированным языком и реляционной базой данных, ORM часто сокращает объем кода, который необходимо написать. [2]
Недостатки инструментов ORM обычно вытекают из высокого уровня абстракции , скрывающей то, что на самом деле происходит в коде реализации. Кроме того, сильная зависимость от программного обеспечения ORM упоминается как основной фактор в создании плохо спроектированных баз данных. [3]
Другой подход заключается в использовании объектно-ориентированной системы управления базами данных (OODBMS) или документно-ориентированных баз данных , таких как собственные базы данных XML , которые обеспечивают большую гибкость в моделировании данных. OODBMS — это базы данных, разработанные специально для работы с объектно-ориентированными значениями. Использование OODBMS устраняет необходимость преобразования данных в форму SQL и обратно, поскольку данные хранятся в исходном объектном представлении, а связи представляются напрямую, а не требуют таблиц /операций соединения. Эквивалент ORM для документно-ориентированных баз данных называется объектно-документными картографами (ODM).
Документно-ориентированные базы данных также избавляют пользователя от необходимости «разбивать» объекты на строки таблиц. Многие из этих систем также поддерживают язык запросов XQuery для извлечения наборов данных.
Объектно-ориентированные базы данных, как правило, используются в сложных, узкоспециализированных приложениях. Одним из аргументов против использования ООСУБД является то, что она может не выполнять специальные, независимые от приложения запросы. [ требуется цитата ] По этой причине многие программисты чувствуют себя более комфортно с системой сопоставления объектов SQL, хотя большинство объектно-ориентированных баз данных способны обрабатывать запросы SQL в ограниченной степени. Другие ООСУБД обеспечивают репликацию в базы данных SQL как средство удовлетворения потребности в специальных запросах, сохраняя при этом известные шаблоны запросов. [ требуется цитата ]
При рассмотрении вопроса о том, как сопоставить объектную систему с реляционной базой данных, возникает множество трудностей. Эти трудности называются несоответствием объектно-реляционного импеданса . [4]
Альтернативой реализации ORM является использование собственных процедурных языков, предоставляемых каждой крупной базой данных. Они могут быть вызваны из клиента с помощью операторов SQL. Шаблон проектирования Data Access Object (DAO) используется для абстрагирования этих операторов и предоставления легкого объектно-ориентированного интерфейса для остальной части приложения. [5]
ORM ограничены своей предопределенной функциональностью, которая может не охватывать все пограничные случаи или функции базы данных. Обычно они смягчают это ограничение, предоставляя пользователям интерфейс для написания сырых запросов, например, Django ORM. [6]
{{cite web}}
: CS1 maint: местоположение ( ссылка )