Что такое ORM? Как приложения работают с базами данных, простое объяснение
ORM (объектно-реляционное отображение) — это программная библиотека, которая стоит между приложением и реляционной базой данных. Вместо того чтобы писать запросы к базе на SQL, разработчики работают с данными как с обычными объектами своего языка программирования — db.booking.create(...) или Booking.find(...) — а ORM переводит это в SQL, выполняет его и превращает результаты обратно в объекты. Известные примеры: Prisma и Drizzle для TypeScript, SQLAlchemy для Python и Entity Framework Core для C#.
Почему ORM важны, когда вы создаёте приложение с ИИ
Когда ИИ-конструктор добавляет в ваше приложение базу данных, он обычно добавляет и ORM, чтобы с ней работать. Писать код ORM вам не придётся, но полезно знать, что он есть:
- Модель данных живёт в коде. Файл схемы ORM часто самое понятное описание данных приложения: какие таблицы есть, какие поля в каждой и как они связаны. Его быстро читают, чтобы проверить, правильно ли ИИ понял ваше приложение.
- Изменения базы идут через миграции. Когда вы просите «добавь клиентам номер телефона», ИИ меняет модель и создаёт миграцию. Понимание этого помогает объяснить, почему изменение может не работать вживую, пока его не применили.
- Безопасность по умолчанию. ORM строят запросы так, что защищают от SQL-инъекций, одной из самых частых дыр в приложениях, где запросы собираются вручную.
- Ловушки скорости. ORM легко приводят к сотням мелких запросов там, где хватило бы одного. Это частая причина медленных страниц в приложениях, созданных ИИ.
Бытовая аналогия
Представьте британского путешественника и японского продавца, которые не говорят на одном языке и общаются через переводчика.
Путешественник (ваше приложение) говорит: «Мне нужны три самых дешёвых чая». Переводчик (ORM) переводит это на точный японский (SQL), передаёт продавцу (базе данных) и переводит ответ обратно на английский.
Путешественник никогда не выучит японский, и для большинства разговоров это нормально. Но для сложных переговоров лучше говорить напрямую, поэтому большинство ORM позволяют при необходимости писать сырой SQL.
Как работает ORM
Базы вроде Postgres хранят данные в таблицах из строк и столбцов и запрашиваются на SQL. Языки программирования работают с объектами: бронь с date, customer и status. ORM связывает одно с другим:
| Сторона базы | Сторона ORM / кода |
|---|---|
Таблица bookings | Модель Booking |
| Строка | Один объект брони |
Столбец starts_at | Поле startsAt |
Внешний ключ customer_id | Связь booking.customer |
SELECT, INSERT, UPDATE, DELETE | Методы find, create, update, delete |
Эти четыре операции — это CRUD-действия, на которых строится почти любое приложение.
Пример: брони с Prisma
Вот упрощённая схема Prisma для приложения записи в салон. Она описывает две таблицы и связь между ними:
model Customer {
id Int @id @default(autoincrement())
name String
email String @unique
bookings Booking[]
}
model Booking {
id Int @id @default(autoincrement())
startsAt DateTime
service String
customer Customer @relation(fields: [customerId], references: [id])
customerId Int
}
Простыми словами: у клиента есть имя, уникальный email и много броней; каждая бронь имеет время начала, услугу и принадлежит одному клиенту.
Теперь приложению нужно получить «ближайшие брони Лены, сначала самые ранние»:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
ORM превращает это примерно в такой SQL, выполняет его и возвращает список объектов брони:
SELECT b.* FROM "Booking" b
JOIN "Customer" c ON c.id = b."customerId"
WHERE c.email = $1 AND b."startsAt" >= $2
ORDER BY b."startsAt" ASC;
$1 и $2 — это плейсхолдеры: email и дата передаются отдельно от текста запроса, и именно это защищает от SQL-инъекций.
Миграции
Если затем вы попросите «дай клиентам добавить номер телефона», ИИ добавит phone String? в модель Customer (знак ? означает, что поле необязательное) и создаст миграцию — небольшой SQL-скрипт вроде ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Миграции сохраняются по порядку, поэтому любую копию базы можно привести к одной структуре, а история изменений сохраняется.
Популярные ORM по языкам
| Язык | Распространённые ORM |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, ORM из Django, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (часто через Spring Data JPA) |
| Ruby | Active Record |
ORM отличаются тем, насколько сильно они прячут SQL. Prisma использует собственный язык схем и стиль запросов; Drizzle намеренно остаётся близким к форме SQL и при этом полностью типизирован. Более лёгкие инструменты, которые называют конструкторами запросов (query builders), например Knex или Kysely для TypeScript, помогают собирать SQL в коде, не превращая строки в полноценные объекты.
Ключевые термины
| Термин | Значение |
|---|---|
| Модель | Описание таблицы и её полей в коде. |
| Схема | Полное описание всех таблиц, полей и связей. |
| Связь | Ссылка между моделями, например бронь принадлежит клиенту. |
| Миграция | Версионированный скрипт, который меняет структуру базы. |
| Конструктор запросов | Более лёгкий инструмент для сборки SQL в коде без полного отображения в объекты. |
| Проблема N+1 | Один запрос на список и ещё один запрос на каждый элемент — медленно при росте данных. |
| Сырой SQL | SQL, написанный вручную, когда ORM мешает. |
Распространённые заблуждения
- «ORM — это база данных». Нет, это переводчик. Базу всё равно нужно выбрать, например Postgres.
- «С ORM не нужно понимать свои данные». Плохо спроектированные таблицы мешают и через ORM. Хорошая модель данных важнее инструмента.
- «ORM всегда медленные». Обычные запросы работают нормально. Замедление обычно связано с такими шаблонами, как N+1, или с отсутствием индексов, а это исправляется.
- «ORM означает, что SQL-инъекций не бывает никогда». Стандартные методы ORM безопасны, но сырой SQL с вставленным пользовательским вводом остаётся опасным.
- «Изменение файла схемы меняет живую базу». Только после создания миграции и её применения к этой базе.
Что спросить у вашего ИИ-конструктора
- «Покажи схему базы данных и объясни каждую таблицу и связь простым языком».
- «Какой ORM используется в проекте и где лежат миграции?»
- «Перед изменением любой таблицы скажи, затронет ли это существующие данные, и никогда не удаляй столбец с данными без вопроса».
- «Проверь самые медленные страницы на запросы N+1 и добавь индексы там, где списки фильтруются или сортируются».
- «Убедись, что каждый запрос с пользовательским вводом идёт через ORM или использует параметры, без SQL, собранного строкой».
ORM в Mythex
Когда приложению нужно сохранять данные, Mythex добавляет в проект отдельную базу Postgres — попросите в чате или используйте команду /database — и передаёт её параметры подключения в рабочее пространство и опубликованное приложение (Database). Агент пишет код, который читает и сохраняет ваши данные. Если у вас есть предпочтение — «используй Prisma», «используй SQLAlchemy» или «только простой SQL, без ORM» — скажите об этом в чате. Попросите агента показать схему, когда захотите проверить структуру; файлы можно открыть в редакторе кода. Общую картину см. в статьях что такое база данных и SQL и NoSQL.
Вопросы
Что такое ORM простыми словами?
ORM (объектно-реляционное отображение) — это программная библиотека, которая стоит между вашим приложением и реляционной базой данных. Она позволяет разработчикам читать и сохранять данные как обычные объекты в их языке программирования, а SQL-запросы за них пишет сама.
Какие бывают примеры ORM?
Распространённые ORM: Prisma и Drizzle для TypeScript и JavaScript, SQLAlchemy и ORM из Django для Python, Entity Framework Core для C#, Hibernate для Java и Active Record в Ruby on Rails.
ORM лучше, чем писать SQL вручную?
Зависит от задачи. ORM делает обычные чтения и записи быстрее в написании, безопаснее и проще в изменении, а SQL вручную даёт полный контроль над сложными отчётами и запросами, где важна скорость. Большинство ORM позволяют при необходимости перейти на сырой SQL.
Что такое миграция?
Миграция — это небольшой версионированный скрипт, который меняет структуру базы данных, например добавляет таблицу или столбец. ORM могут создавать миграции из вашей модели данных, чтобы каждая копия базы — на ноутбуке, при тестировании и в продакшене — имела одинаковую структуру.