ORM (Object-Relational Mapping)

Способ работать с базой данных через объекты в коде: программа меняет объекты, а ORM сама превращает это в SQL-запросы.

ORM (Object-Relational Mapping, объектно-реляционное отображение) — прослойка между кодом приложения и реляционной базой данных, например PostgreSQL. Она связывает таблицы с классами, строки — с объектами, а столбцы — с их полями. Разработчик работает с привычными объектами, а запросы к базе ORM составляет сама.

Как это работает

В базе есть таблица заказов orders, а в коде — класс Order. Чтобы получить оплаченные заказы дороже 1000 рублей, на Django ORM (Python) пишут:

# Python (Django ORM)
orders = Order.objects.filter(status="paid", total__gt=1000)

ORM превратит эту строку примерно в такой запрос:

-- SQL
SELECT id, status, total, customer_id FROM orders WHERE status = 'paid' AND total > 1000;

И обратно: каждая строка ответа станет объектом Order, у которого можно прочитать order.total или перейти к покупателю через order.customer. Связь классов и объектов здесь та же, что в объектно-ориентированном программировании.

Что берет на себя ORM

  • Запросы. Выборка, вставка, изменение и удаление без ручного SQL для типовых случаев.
  • Связи между таблицами. «Один ко многим» и «многие ко многим» становятся обычными полями объектов.
  • Миграции. Изменение структуры базы описывается в коде и применяется одинаково на всех серверах.
  • Транзакции. Несколько изменений сохраняются целиком или не сохраняются вовсе — по правилам ACID.
  • Защита от SQL-инъекций. Значения передаются в базу отдельно от текста запроса, поэтому классическая SQL-инъекция не срабатывает.
  • Переносимость. Один и тот же код может работать с разными СУБД, если не использовать их особые возможности.

Популярные ORM

  • Java — Hibernate;
  • .NET — Entity Framework;
  • Python — Django ORM, SQLAlchemy;
  • JavaScript и TypeScript — Prisma, TypeORM, Sequelize;
  • Go — GORM;
  • Ruby — Active Record в Ruby on Rails.

Плюсы и минусы

Плюсы — меньше однообразного кода, быстрее разработка типовых функций, единый стиль работы с данными во всей команде и меньше ошибок при сборке запросов вручную.

Минусы проявляются, когда данных становится много:

  • Проблема N+1. Код получает 100 заказов, а потом в цикле обращается к покупателю каждого. ORM незаметно делает 101 запрос вместо одного-двух. Лечится явной подгрузкой связанных данных (в Django — select_related).
  • Тяжелые выборки. Сложные отчеты с группировками и подзапросами ORM строит неоптимально, а иногда не может выразить вовсе.
  • Скрытые запросы. Из кода не видно, что именно уходит в базу, поэтому без индексов и контроля запросов система замедляется постепенно и незаметно.

Как ORM применяют на практике

В корпоративных системах обычно сочетают оба подхода: типовые операции — карточки клиентов, заявки, справочники — делают через ORM, а отчеты, выгрузки и критичные по скорости запросы пишут на SQL. Запросы, которые генерирует ORM, включают в журнал и проверяют на тестовых данных близкого к боевому объема, а частые результаты выносят в кэш. Такой баланс — обычная часть разработки информационных систем.

Не путать с ORM в маркетинге

В маркетинге та же аббревиатура означает Online Reputation Management — управление репутацией компании в интернете. Это другое понятие: в этом термине ORM — только инструмент программирования.