ORM (Object Relational Mapping) — это техника, которая связывает полноценные объекты языка программирования с таблицами в реляционной системе управления базами данных.
С помощью ORM можно манипулировать данными в базе данных через объекты, не прибегая к написанию SQL-запросов вручную. Это достигается за счет автоматического преобразования объектов в строки таблиц базы данных и обратно. Такой подход не только упрощает работу с данными в объектно-ориентированных системах, но и позволяет взаимодействовать с ними на более интуитивном уровне благодаря повышению абстракции.
Фреймворки ORM
Примеры фреймворков которые реализуют ORM, каждый же в свою очередь под капотом использует паттерн (шаблон) для работы с данными:
PHP
- Doctrine. Популярный ORM для PHP. Основан на паттерне Data Mapper
- Eloquent. ORM, используемый в Laravel. Основан на паттерне Active Record
Java
- Hibernate. Cамый популярный ORM-фреймворк для Java
- JPA. Стандартный интерфейс для управления реляционными данными в Java
Что используют фреймворки под капотом
- Active Record — это шаблон проектирования или один из слоев приложения, который несет ответственность за представление бизнес-логики и данных. Active Record позволяет создавать и использовать более просто те объекты, который требуют постоянного хранения в базе данных. Если говорить в отношении MVC, то Active Record реализует первую букву М — то есть модель. В Active Record сама модель также отвечает и за сохранение данных в базу данных. А это означает, что нарушается первый принцип из SOLID — принцип единственности ответственности. Класс отвечает не только за представление данных, но и за сохранение
- Data Mapper — это слой доступа к данным, который предоставляет двунаправленный маппинг данных между постоянным хранилищем данных и хранением данных в памяти. В отличие от Active Record, в Data Mapper появляется еще один слой или тип сущности такой как entityManager. Именно этот слой будет отвечать за перенос состояния модели в базу данных и обратно
- DAO (Data Access Object)/Repository Pattern — слой абстракции доступа к данным, обычно самописные
Разные фичи реализации
- Eager Loading — жадная загрузка связанных объектов сущности одновременно с основным объектом. Предотвращает множество дальнейших запросов, но плохо сказывается на быстроте выполнения чтения
- Lazy Loading — ленивая загрузка, позволяющая оптимизировать процесс чтения и получать связанные объекты только при необходимости
- Identity Map — жадное получение объекта из базы данных 1 раз в рамках сессии. Позволяет избегать возможного противоречия в данных, возникающих из-за нескольких запросов
- Unit of Work — собирает все изменения во всех объектах и позволяет выполнить их в рамках одной транзакции. Благоприятно сказывается на консистентности данных и количестве запросов
Заключение
ORM фреймворки это отличное решение, которое позволит быстро и легко начать работать с базами данных прямо из коробки, но также они представляют довольно большой набор различных подходов и реализаций, что дает возможность углубиться в тонкую кастомизацию при необходимости. Современные ORM фреймворки предоставляют возможность гибко настраивать взаимодействие с базой данных, изменять внутренние настройки и даже переходить на raw запросы при необходимости.
ORM является стандартом индустрии и позволяет разработчику работать бензопилой, а не топором.