Статьи

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

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

Примеры:

Java

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

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

  • MyBatis: SQL Map framework.

Python

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

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

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

JavaScript/Node.js

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

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

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

Ruby

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

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

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

PHP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение:

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

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

Всем спасибо, кто дочитал этот пост до конца. Изучайте, пользуйтесь!
Основы программирования