Продолжаем тему ORM обзором на популярные фреймворки. В начале стоит сказать, что их на данный момент существует великое множество для самых разных стеков и языков программирования. С#, Java, Python, JavaScript, Node. Js, Ruby, PHP, Go, Rust — не имеет значения, возможность работать с БД через ORM паттерн сейчас присутствует практически в каждом стеке, и даже если речь на первый взгляд идет о фронтенде (???).
Примеры:
Java
Python
JavaScript/Node.js
Ruby
PHP
Давайте теперь поговорим о разных реализациях ORM паттерна:
И возможных фичах, которые также относятся к реализации:
А что используют фреймворки под капотом?
Эти паттерны могут использоваться отдельно или в сочетании, в зависимости от требований приложения и выбранного ORM. Некоторые из них являются взаимоисключающими, а некоторые наоборот дополняют друг друга. Например вы не сможете пользоваться Active Record и Data Mapper паттернами одновременно, но Repository Pattern отлично дополнит ваше приложение с Data Mapper’ом. И если некоторые из паттернов являются основополагающими, то другие вполне могут применяться в качестве дополнительных опций. Например в Hibernate вы можете легко установить FetchType. LAZY для ленивой подгрузки связанных объектов основной сущности.
Глубина кастомизации:
И тут мы плавно подходим к тому, что ORM фреймворки это «easy to go» решение, которое позволит вам быстро и легко начать работать с базами данных прямо из коробки, но также они представляют довольно большой набор различных подходов и реализаций, что дает возможность углубиться в тонкую кастомизацию при необходимости. Современные ORM фреймворки предоставляют возможность гибко настраивать взаимодействие с бд, тюнить внутренние настройки и даже переходить на raw запросы при необходимости. Если изучить тему подробно, то можно практически полностью компенсировать все минусы от использования ORM, выбрав правильный фреймворк и его конфигурацию.
Если хотите начать работать с ORM:
Изучите ТОП-3 популярных решения для вашего стека, узнайте об их спецификации, плюсах и минусах. Получите набор знаний и понимание, к какому из решений в стоит прибегать и в каком случае. Если уже работаете, то обязательно изучите возможности кастомизации вашего фреймворка, скорее всего сможете извлечь для себя что-то полезное и сделать свой код чуточку эффективнее и лучше.
Заключение:
ORM является стандартом индустрии, и позволяет разработчику работать бензопилой, а не топором.
Это накладывает некоторые ограничения (контракт), но значительно увеличивает эффективность работы и позволяет тратить меньше времени на проектирование БД и рутинные операции с SQL запросами.
Всем спасибо, кто дочитал этот пост до конца. Изучайте, пользуйтесь!
Примеры:
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 запросами.
Всем спасибо, кто дочитал этот пост до конца. Изучайте, пользуйтесь!