Почему ORM — это зло (альтернативная позиция)

Альтернативная позиция: ORM (Hibernate, Entity Framework, TypeORM, Sequelize, Prisma в роли ORM) — это зло. Не путать с Query Builder и MetaSql — это другой класс инструментов.

Концептуальная проблема

  • ORM пытается поженить две принципиально разные модели: реляционную (множества, проекции, JOIN) и объектно-ориентированную (наследование, агрегаты).
  • ООП хорошо моделирует системные сущности (Stream, Promise, Socket) и реальный мир — но плохо для документов, заявок, бухгалтерии.
  • В отделе кадров — уже не реальный мир, а пережёванная человеками абстракция, которую через ООП моделировать неестественно.

Практическая проблема

  • ORM забирает оптимизации СУБД: специальные типы (картография, money, временные ряды), хранимые процедуры, оконные функции, кастомные индексы.
  • Все эти оптимизации перетекают в прикладной код на JS — он в 10-100× медленнее.
  • ORM добавляет связанность системы: вместо динамического доступа к разным возможностям СУБД — единый шлюз.

Проблема проекций

  • В БД одна и та же сущность даёт разные проекции: список с короткими полями, карточка с полным составом, агрегат для отчёта.
  • В ООП через наследование это не моделируется — каждая проекция требует свой класс.
  • В реальных системах используют разные приёмы: даже при ORM кто-то ходит мимо неё в SQL для оптимизаций.

Когда ORM приемлем

  • Прототипы, MVP, маленькие проекты.
  • Команда не имеет SQL-экспертизы.
  • БД скорее всего не сменится (а индустриально она почти никогда не меняется — миф «абстракция БД» Автор утверждает фальшивым).

Альтернативы (по автору)

  • Query Builder (Knex, Kysely) — даёт типы и удобство, не натягивает ООП.
  • Repository + DAO — слой доступа, явный SQL внутри.
  • MetaSql (Metarhia) — schema-first, без ORM-ной магии.
  • Хранимые процедуры для бизнес-логики, требующей скорости.

Антипаттерн

// плохо: ORM + ленивая загрузка → N+1 запросов
const users = await User.findAll;
for (const u of users) {
  console.log(await u.getOrders); // отдельный SELECT на каждого
}

🎓 Источники

  • 🎓 [Почему ORM это зло] · 2023-09-05 · YouTube
    • Альтернативная позиция: «ORM женит реляционную и ООП модели». «ORM забирает оптимизации СУБД». «Абстракция БД, которую ORM как бы даёт — на практике никому не нужна, никто базу не меняет».
  • 🎓 [UNION types и ORM, DTO, Query Builder] · 2025-12-17 · YouTube
    • Запрет на использование ORM в проектах автора. Query Builder — нормально.
  • 🎓 [ООП, Transaction script, ORM] · 2023-06-16 · YouTube
    • «ООП — для системного программирования. Для предметной области отвратителен». Critique against DDD-extremists.

См. также