Статьи

Популярные ORM фреймворки

Продолжаем тему ORM обзором на#nbsp;популярные фреймворки. В#nbsp;начале стоит сказать, что их#nbsp;на#nbsp;данный момент существует великое множество для самых разных стеков и#nbsp;языков программирования. С#, Java, Python, JavaScript, Node. Js, Ruby, PHP, Go, Rust#nbsp;— не#nbsp;имеет значения, возможность работать с#nbsp;БД через ORM паттерн сейчас присутствует практически в#nbsp;каждом стеке, и#nbsp;даже если речь на#nbsp;первый взгляд идет о#nbsp;фронтенде (???).

Примеры:

Java

  • Hibernate: Cамый популярный ORM-фреймворк для Java.

  • JPA: Стандартный интерфейс для управления реляционными данными в#nbsp;Java.

  • MyBatis: SQL Map framework.

Python

  • Django ORM: Интегрирован в#nbsp;веб-фреймворк Django.

  • SQLAlchemy: Мощный и#nbsp;гибкий инструмент для SQL и#nbsp;ORM.

  • Peewee: Более легкий и#nbsp;простой ORM.

JavaScript/Node.js

  • Sequelize: ORM для Node. js, поддерживающий PostgreSQL, MySQL, MariaDB, SQLite и#nbsp;Microsoft SQL Server.

  • TypeORM: ORM для TypeScript и#nbsp;JavaScript (ES7, ES6, ES5).

  • Objection.js: SQL-friendly ORM для Node.js.

Ruby

  • Active Record: ORM, интегрированный в#nbsp;Ruby on#nbsp;Rails.

  • Sequel: Простой и#nbsp;гибкий ORM для Ruby.

  • ROM: Гибкий и#nbsp;более конфигурируемый ORM.

PHP

  • Doctrine: Популярный ORM для PHP.

  • Eloquent: ORM, используемый в#nbsp;Laravel.

  • Propel: Еще один популярный ORM для PHP.

Давайте теперь поговорим о#nbsp;разных реализациях ORM паттерна:

  • DAO (Data Access Object)/Repository Pattern#nbsp;— слой абстракции доступа к#nbsp;данным, обычно самописные.

  • Active record (Django ORM, Tortoise ORM, Orator) —#nbsp;это шаблон проектирования или один из#nbsp;слоев приложения, который несет ответственность за#nbsp;представление бизнес-логики и#nbsp;данных. Active Record позволяет создавать и#nbsp;использовать более просто те#nbsp;объекты, который требуют постоянного хранения в#nbsp;базе данных. Если говорить в#nbsp;отношении MVC, то#nbsp;Active Record реализует первую букву М#nbsp;— то#nbsp;есть модель. В#nbsp;Active record сама модель отвечает за#nbsp;сохранение данных в#nbsp;базу данных. А#nbsp;это означает, что нарушается первый принцип из#nbsp;SOLID#nbsp;— принцип единственности ответственности. Класс отвечает не#nbsp;только за#nbsp;представление данных, но#nbsp;и#nbsp;за сохранение.

  • Data mapper (SQLAlchemy)#nbsp;— это слой доступа к#nbsp;данным, который предоставляет двунаправленный маппинг данных между постоянным хранилищем данных и#nbsp;хранением данных в#nbsp;памяти. В#nbsp;отличие от#nbsp;Active Record, в#nbsp;Data Mapper появляется еще один слой или тип сущности такой как entityManager. Именно этот слой будет отвечать за#nbsp;перенос состояния модели в#nbsp;базу данных и#nbsp;обратно.

И#nbsp;возможных фичах, которые также относятся к#nbsp;реализации:

  • Eager Loading —#nbsp;жадная загрузка связанных объектов сущности одновременно с#nbsp;основным объектом. Предотвращает множество дальнейших запросов, но#nbsp;плохо сказывается на#nbsp;быстроте выполнения чтения.

  • Lazy Loading#nbsp;— ленивая загрузка, позволяющая оптимизировать процесс чтения и#nbsp;получать связанные объекты только при необходимости.

  • Identity Map —#nbsp;жадное получение объекта из#nbsp;базы данных 1 раз в#nbsp;рамках сессии. Позволяет избегать возможного противоречия в#nbsp;данных, возникающих из-за нескольких запросов.

  • Unit of#nbsp;Work#nbsp;— сбирает все изменения во#nbsp;всех объектах и#nbsp;позволяет выполнить их#nbsp;в#nbsp;рамках одной транзакции. Благоприятно сказывается на#nbsp;консистентности данных и#nbsp;количестве запросов.

А#nbsp;что используют фреймворки под капотом?

Эти паттерны могут использоваться отдельно или в#nbsp;сочетании, в#nbsp;зависимости от#nbsp;требований приложения и#nbsp;выбранного ORM. Некоторые из#nbsp;них являются взаимоисключающими, а#nbsp;некоторые наоборот дополняют друг друга. Например вы#nbsp;не#nbsp;сможете пользоваться Active Record и#nbsp;Data Mapper паттернами одновременно, но#nbsp;Repository Pattern отлично дополнит ваше приложение с#nbsp;Data Mapper’ом. И#nbsp;если некоторые из#nbsp;паттернов являются основополагающими, то#nbsp;другие вполне могут применяться в#nbsp;качестве дополнительных опций. Например в#nbsp;Hibernate вы#nbsp;можете легко установить FetchType. LAZY для ленивой подгрузки связанных объектов основной сущности.

Глубина кастомизации:

И#nbsp;тут мы#nbsp;плавно подходим к#nbsp;тому, что ORM фреймворки это «easy to#nbsp;go» решение, которое позволит вам быстро и#nbsp;легко начать работать с#nbsp;базами данных прямо из#nbsp;коробки, но#nbsp;также они представляют довольно большой набор различных подходов и#nbsp;реализаций, что дает возможность углубиться в#nbsp;тонкую кастомизацию при необходимости. Современные ORM фреймворки предоставляют возможность гибко настраивать взаимодействие с#nbsp;бд, тюнить внутренние настройки и#nbsp;даже переходить на#nbsp;raw запросы при необходимости. Если изучить тему подробно, то#nbsp;можно практически полностью компенсировать все минусы от#nbsp;использования ORM, выбрав правильный фреймворк и#nbsp;его конфигурацию.

Если хотите начать работать с#nbsp;ORM:

Изучите ТОП-3 популярных решения для вашего стека, узнайте об#nbsp;их#nbsp;спецификации, плюсах и#nbsp;минусах. Получите набор знаний и#nbsp;понимание, к#nbsp;какому из#nbsp;решений в#nbsp;стоит прибегать и#nbsp;в#nbsp;каком случае. Если уже работаете, то#nbsp;обязательно изучите возможности кастомизации вашего фреймворка, скорее всего сможете извлечь для себя что-то полезное и#nbsp;сделать свой код чуточку эффективнее и#nbsp;лучше.

Заключение:

ORM является стандартом индустрии, и#nbsp;позволяет разработчику работать бензопилой, а#nbsp;не#nbsp;топором.

Это накладывает некоторые ограничения (контракт), но#nbsp;значительно увеличивает эффективность работы и#nbsp;позволяет тратить меньше времени на#nbsp;проектирование#nbsp;БД и#nbsp;рутинные операции с#nbsp;SQL запросами.

Всем спасибо, кто дочитал этот пост до#nbsp;конца. Изучайте, пользуйтесь!
2024-01-10 12:42 Основы программирования