Что такое орм в программировании
Перейти к содержимому

Что такое орм в программировании

  • автор:

Что такое орм в программировании

Object-Relational Mapping — объектно-реляционное отображение — технология связывания таблиц реляционной базы данных с объектами языка программирования. В платформе CUBA используется реализация ORM на основе фреймворка EclipseLink.

Использование ORM дает ряд очевидных преимуществ:

  • Позволяет работать с данными реляционной СУБД, манипулируя объектами Java.
  • Упрощает программирование, избавляя от рутины написания тривиальных SQL-запросов.
  • Упрощает программирование, позволяя извлекать и сохранять целые графы объектов одной командой.
  • Обеспечивает легкое портирование приложения на различные СУБД.
  • Позволяет использовать лаконичный язык запросов JPQL.

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

Если вы столкнулись с проблемами производительности при доступе к БД, начните с того, что проверьте, какие конкретно SQL-операторы выполняются в вашем приложении. Вы можете использовать логгер eclipselink.sql для вывода всех SQL-операторов, генерируемых ORM, в файл лога.

Достоинства, недостатки и альтернативы объектно-реляционного отображения (ORM) Текст научной статьи по специальности «Компьютерные и информационные науки»

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Романов С.С.

В работе рассматривается понятие объектно-реляционного отображения , его достоинства и недостатки, а также возможные альтернативы.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Романов С.С.

ОБ ЭФФЕКТИВНОСТИ НАСЛЕДОВАНИЯ ТАБЛИЦ В СУБД PostgreSQL

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

Использование технологии объектно-реляционного отображения при разработке конвертера учебных курсов
Методы оптимизации хранения и обработки объектов в реляционных базах данных
Интеграция оперативной системы обработки и хранилища данных электромагнитных зондирований
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Достоинства, недостатки и альтернативы объектно-реляционного отображения (ORM)»

Магистрант 2 курса,

Хакасский Государственный Университет им. Н. Ф. Катанова

ДОСТОИНСТВА, НЕДОСТАТКИ И АЛЬТЕРНАТИВЫ ОБЪЕКТНО-РЕЛЯЦИОННОГО ОТОБРАЖЕНИЯ (ORM)

В работе рассматривается понятие объектно-реляционного отображения, его достоинства и недостатки, а также возможные альтернативы.

Ключевые слова: ORM, объектная модель, реляционная модель, объектно-реляционное отображение.

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

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

Рассмотрим понятие ORM. Согласно [5], ORM — это мощное средство для проектирования и осуществления запросов к моделям базы данных на концептуальном уровне, где приложение описано в терминах, понятных для технически неподкованных пользователей.

В другом источнике [3] отмечается, что ORM — это библиотека языка программирования, выполняющая отображение объектов реляционной модели на объекты языка программирования.

Также ORM называют «технологией программирования, позволяющей преобразовывать несовместимые виды моделей в ООП, для того, чтобы упростить процедуру сохранения объектов в реляционную БД и их извлечения» [2].

Как правило, отображение двунаправлено: операции с атрибутами объекта ведут к чтению/записи данных из/в соответствующие таблицы базы данных [3]. Для использования и управления ORM в программном коде задается отображение схемы базы данных на схему языка программирования. Пример на языке Python [там же] представлен в листинге ниже.

Листинг 1 — Пример определения отображения схемы базы данных на схему языка

class Elephant(DBTable): # Класс, определяющий таблицу elephants table_name = «elephants»

id = IntegerColumn(auto_increment=True, primary_key=True) # Первичный ключ color = StringColumn(default=None, length=30) elephant = Elephant.new() # INSERT, т.е. создание новой строки в таблице elephant = Elephantnew(color=«pink») # INSERT, т.е. новая строка с данными elephant = Elephant(id=2112) # извлечение новой строки по id elephants = Elephant.select(color=«pink») #извлечение нескольких строк по цвету color = elephant.color # Выполняет SELECT и, возможно, кэширует результат elephant.color = «pink» # Выполняет UPDATE, т.е. запись данных в таблицу

Для того, чтобы «привязать» объект к его соответствующим данным в БД применяется отображение. Создается некая виртуальная схема БД в памяти, благодаря

которой OMR дает возможность оперировать данными на уровне объектов и которая определяет связь между свойствами объекта с одной и более таблицами и полями в БД. ORM, опираясь на эти данные, управляет преобразованием данных между БД и объектами, создает SQL-запросы при изменении объектов.

Среди достоинств ORM выделяют [3, 2]:

• наличие явного описания схемы БД, представленное в терминах какого-либо языка программирования, которое находится и редактируется в одном месте;

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

• возможность автоматического создания SQL-запросов, которая избавляет от необходимости использования языка для описания структуры БД (Data Definition Language) и языка манипулирования данными (Data Manipulation Language) при проектировании БД и изменении её схемы соответственно;

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

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

• код, генерируемый ORM гипотетически проверен и оптимизирован, следовательно не нужно беспокоиться о его тестировании;

• развитые реализации ORM поддерживают отображение наследования и композиции на таблицы;

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

Среди недостатков ORM выделяются [3, 4, 2]:

• Дополнительная нагрузка на программиста, которому, в случае использования ORM необходимо изучать этот некий «дополнительный слой» между программной и базой данных, который к тому же создает дополнительный уровень абстракции — объекты ORM. В связи с этим могут возникнуть вопросы соответствия особенностям ООП и соответствующим реляционным операциям. Эту проблему называют impedance mismatch, а сама реализация ORM ведет к увеличению объема программного кода и снижению скорости работы программы. Однако, с другой стороны, ORM наглядно и в одном месте концентрирует различие между реляционной и объектно-ориентированной парадигмами, что нельзя назвать недостатком;

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

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

• Требуются отдельные таблицы в случае прямого отображения классов в таблицы и необходимости отображения атрибутов множественного характера.

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

В случае небольших проектов, которые не сталкиваются с высокой нагрузкой, применение ORM очевидно, особенно, если учесть такой важный критерий разработки, как время. «То, что с легкостью пишется с использованием ORM за неделю, можно реализовывать ни один месяц собственными усилиями», отмечается в [2].

Касательно альтернатив технологии ORM, то среди них выделяются [1, 4]:

• сознательное нарушение нормализации таблиц в реляционной модели, которое, хотя и приводит к избыточности данных наряду с появлением необходимости их синхронизации, обеспечивает преимущество ускорения доступа к данным;

• подход CoRM (Collection-Relational Mapping — реляционное отображение коллекций), при котором осуществляется объединение разрозненных коллекций объектов с помощью хорошо определенных реляционных взаимоотношений между коллекциями и прототипом которого могут служить документ-ориентированные СУБД (например, MongoDB);

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

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

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

1. Буч Гради, Максимчук Роберт А., Энгл Майкл У., Янг Бобби Дж., Коналлен Джим, Хьюстон Келли А. Объектно-ориентированный анализ и проектирование с примерами приложений [Текст] / Гради Буч, Роберт А. Максимчук, Майкл У. Энгл, Бобби Дж. Янг, Джим Коналлен, Келли А. Хьюстон. — М.: ООО «И.Д. Вильямс», 2008. — 720 с.

Что такое орм в программировании

Что такое ORM? ORM дословно Object Relational Mapping — объектно-реляционное связывание — комплекс программ, позволяющих работать с базами данных, как если бы они были объектами языка программирования, в данном случае Python.

Или иначе — ORM это набор классов, добавляющих еще один уровень абстракции к таблицам, хранящимся в базе данных. Эта абстракция позволяет работать с объектами БД как с объектами используемого языка программирования, не отвлекаясь на их преобразование в язык SQL. ORM целесообразно использовать в больших проектах, использующих БД, однако для повышения скорости выполнения запросов некоторые программисты предпочитают самостоятельно формировать нужные SQL-запросы. Причина в том, что в случае сложных запросов ORM не всегда генерирует оптимальный SQL-запрос к БД, что в случае большой выборки весьма существенно, особенно если выборка идет по нескольким таблицам. Несмотря на существующие недостатки, ORM широко распространены и существуют во многих языках программирования: Java, C#, PHP, Python, C++ и др.

Использовать ORM в ваших проектах или нет — решать Вам, однако я настоятельно рекомендую ознакомиться с этой технологией, так как она широко используется во многих сферах, в том числе в Java Enterprise.

На сегодняшний момент существует несколько ORM для Python, среди них:

Наиболее популярной является 1 и 2, однако 3 и 4 являются хорошей альтернативой.

Системы ORM 1 и 2 — это два больших монстра, хотя и позволяют выполнить многое, но как говорит гугл, в этом случае производительность по сравнению с обычным SQL-запросом падает до 3 раз.

Системы 3 и 4 позиционируются как легковесные, не обладают полным функционалом 1 и 2, но его достаточно для выполнения большинства сложных запросов. Стоит отметить, что их производительность по сравнению с 1 или 2 выше.

Для простоты рассмотрим особенности работы с PeeWee.

Для установки пакета с командной строке наберите pip install peewee .

Определение модели

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

Термин Соответствие
Класс модели таблица в БД
Экземпляр поля столбец в таблице
Экземпляр сущности строка в таблице

При создании проекта с peewee , можно начать с определения модели.

from peewee import * # Создаем подключение к БД db = SqliteDatabase('people.db') class Person(Model): name=CharField() birthday=DateField() is_relative=BooleanField() # Здесь мы указываем соединение с БД class Meta: database=db 

В этом примере мы создаем подключение к базе данных SQLite (файл people.db) и определяем класс модели Person . В этом же классе в подклассе Meta расположена database — переменная соединения с БД.

Внимание! мы назвали нашу модель Person вместо People . Вы должны придерживаться этого правила, даже если таблица будет содержать множество людей, мы всегда назовем класс существительным в единственном числе.

В PeeWee определено много типов столбцов:

Field Type Sqlite Postgresql MySQL
CharField varchar varchar varchar
FixedCharField char char char
TextField text text longtext
DateTimeField datetime timestamp datetime
IntegerField integer integer integer
BooleanField integer boolean bool
FloatField real real real
DoubleField real double precision double precision
BigIntegerField integer bigint bigint
SmallIntegerField integer smallint smallint
DecimalField decimal numeric numeric
PrimaryKeyField integer serial integer
ForeignKeyField integer integer integer
DateField date date date
TimeField time time time
TimestampField integer integer integer
BlobField blob bytea blob
UUIDField text uuid varchar(40)
BareField untyped not supported not supported

Чтобы открыть соединение с БД нужно написать

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

Определение связей происходит при помощи внешнего ключа

class Pet(Model): owner = ForeignKeyField(Person, related_name='pets') name = CharField() animal_type = CharField() class Meta: database = db # this model uses the "people.db" database 

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

создание таблиц в БД происходит следующим образом:

db . create_tables ([ Person , Pet ])

сохранение экземпляра класса в БД происходит по команде:

grandma = Person . create ( name = ‘Grandma’ , birthday = date ( 1935 , 3 , 1 ), is_relative = True )

Подробная документация находится здесь

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

ORM SQLAlchemy

Работа с этой ORM начинается с импорта элементов из пакета sqlalchemy.

Для подключения к БД мы создаем объект Engine, который создает связку пула подключения и диалекта конкретной БД.

Далее нужно создать базовый класс для объявления сущностей наших данных

Потом мы описываем связываемые таблицы через наследование от класса Base .

from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:', echo=True) from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy import Column, Integer, String class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) def __repr__(self): return "" % ( self.name, self.fullname, self.password) 

В этом примере мы определили связку сущности User и таблицы users .

Для создания экземпляра сущности просто создайте объект класса User .

u = User ( name = ‘Isac’ , fullname = ‘Newton’ , password = ‘123’ )

Указывать параметры при вызове конструктора не обязательно, присвоить значения полям экземпляра сущности можно и после.

 u=User() u.name='Isac' u.fullname='Newton' u.password='123' 

Для того, чтобы связаться с базой данных и начать с ней диалог, создадим класс сессия.

from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) # и создадим экземпляр этого объекта session=Session() 

теперь мы можем сохранять наши экземпляры сущностей в базу.

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword') session.add(ed_user) session.add(u) session.commit() 

Обратите внимание, что после commit() поле id примет автоматически инициализированного значения. (id — первичный ключ, автоинкрементный)

Блог

ORM — (Object Relative Mapping) — это паттерн проектирования, который позволяет наладить взаимосвязь между классом и таблицей в Базе Данных. ORM системы присутствуют в любом большом фреймворке — Laravel, ASP .Net, ORM Django и у многих других. Какие знания вам нужны, чтобы понять устройство ORM системы (и может быть, написать свою самостоятельно)? Во-первых, здесь не помешают знания объектно — ориентированного программирования, чтобы можно было создать класс с необходимыми полями и свойствами. Также, к каждой ORM системе необходимо разработать свою систему переноса полей (или свойств) класса внутрь таблиц большинства популярных баз данных — MySQL, PostgreSQL, и другие популярные реляционные БД. По сути каждому бекенд-программисту могут быть полезны глубокие знания по базам данных, например по сложным запросам, или по типам данных, которые работают в данной базе данных. ORM же позволяет программисту не вдаваться глубоко в структуру базы данных, а создать само описание таблицы в виде привычного и понятного класса, и затем сделать миграцию. Что такое миграция? Это процесс превращения класса в таблицу.

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

  • — Изучите популярные базы данных и типы переменных;
  • — Изучите подробно ООП на выбранном языке программирования
  • — Изучите самостоятельно базы данных и виды связей между таблицами.
  • — И изучите фреймворк, который популярен на рынке! Не забудьте вместе с ним изучить ORM систему, которая обычно используется совместно с ним.

Гайд для трудоустройства в IT. Навыки, профессии и возможности.

Многие люди хотят начать путь в IT, но их останавливает то, что они не понимают, с чего начать. Именно это мы слышим на наших занятиях от студентов и именно поэтому они приходят к нам.

19 января 2024

Gradle — система сборки для Java, Kotlin и C++

Сегодня мы расскажем про систему сборки Gradle, которая широко используется, например, при сборке Java — приложений.

29 апреля 2021

Golang — востребованность и сферы применения

Сегодня мы решили рассказать, что из себя представляет язык программирования Golang — зачем он нужен, и как его можно использовать. Он был придуман в корпорации Google для того, чтобы разрабатывать быстрые и надежные бекенд – приложения (однако создан для того, чтобы писать, а не читать).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *