Почему 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.