Блок 2 · Урок 4 из 5

Модель данных и ORM

Чертёж данных приложения — то немногое, на что заказчик реально влияет; и «переводчик» (ORM), благодаря которому агент пишет prisma.user.findMany() вместо ручного SQL.

≈ 9 минут 📐 чертёж данных 🎯 цель: уметь описать агенту сущности и связи

Зачем это вам

Из всего технического стека модель данных — то место, где ваше участие в начале проекта решает судьбу архитектуры. Если вы скажете агенту: «у нас пользователи, проекты и задачи; у проекта много задач, задача принадлежит одному пользователю» — он построит правильный чертёж с первого раза. Если промолчать — агент угадает сам, и потом это придётся переделывать. Кривая модель данных превращается в вечные костыли. А зная слова ORM, Prisma и «миграция», вы понимаете, что именно агент делает с базой, — и не пугаетесь, когда он говорит «применю миграцию на проде».

Чертёж и переводчик

Модель данных — главный чертёж; ORM — тот, кто его читает

Модель данных описывает, какие «вещи» есть в приложении, какие у них свойства и как они связаны. ORM превращает этот чертёж в реальные таблицы базы и берёт на себя всю рутину запросов.

Часть 1: модель данных

Модель данных — это описание сущностей (entity) вашего приложения и связей между ними. Сущность — это тип объекта: пользователь, заказ, товар, статья. Каждая сущность обычно становится одной таблицей в базе данных.

У каждой сущности есть поля: у пользователя — id, email, имя; у заказа — id, сумма, статус. И у сущностей есть связи (relationship) — отношения между ними:

Хорошая модель — половина успеха. Если вы правильно описали сущности и связи в начале, агент выстраивает всё остальное логично и без костылей.1

Часть 2: ORM и Prisma

ORM (Object-Relational Mapping, объектно-реляционное отображение) — инструмент-«переводчик» между миром кода и миром базы данных. В коде разработчик работает с объектами и классами; база данных понимает только SQL-запросы. ORM стоит между ними и переводит в обе стороны.2

Разработчик (или агент) описывает модели один раз в специальном файле-схеме — а ORM сам создаёт таблицы, генерирует SQL и даёт удобный API для запросов. Вместо SELECT * FROM users WHERE id = 1 пишется просто prisma.user.findUnique({ where: { id: 1 } }).

В мире TypeScript/Node.js (а именно там работает большинство приложений, которые строят вайб-кодеры) чаще всего встречаются два ORM: Prisma2 и Drizzle3. Prisma — самый популярный, с подробной документацией; Drizzle — более лёгкий и близкий к сырому SQL.

Вот как выглядит упрощённая схема в стиле Prisma — именно такой файл агент пишет и редактирует в вашем проекте:

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  orders  Order[]               // у пользователя МНОГО заказов
}

model Order {
  id      Int      @id @default(autoincrement())
  total   Int
  userId  Int
  user    User     @relation(fields: [userId], references: [id])
                               // заказ принадлежит ОДНОМУ пользователю
}

Здесь видно всё главное: две сущности (User и Order), их поля (id, email, total) и связь «один-ко-многим» — через Order[] у пользователя и @relation у заказа. Это и есть модель данных, записанная в ORM-схему.

📌 Правило заказчика: опишите агенту сущности и связи своими словами в самом начале проекта — «у нас есть X, Y, Z; X связан с Y так-то». Это дешевле, чем переделывать базу потом.

Аналогия, которую можно пересказать

Переводчик на складе

Вы, говорящий на родном языке— код приложения, оперирующий объектами: user.orders, order.total
Кладовщик, знающий только местный— база данных, понимающая только SQL: SELECT, JOIN, WHERE
Переводчик— ORM (Prisma, Drizzle): превращает объекты в SQL-запросы и возвращает ответ обратно в удобном виде
Согласованный разговорник— схема модели: список сущностей, полей и связей, который вы согласовали заранее

Вы говорите объектами, база — таблицами и SQL. ORM переводит в обе стороны и избавляет от необходимости писать SQL вручную. Но качество перевода зависит от того, насколько чётко вы составили «разговорник» — то есть описали модель.

Запомните одно

Модель данных — главный чертёж приложения, и это ваша зона влияния

Из всего технического стека модель данных — то, на что заказчик влияет сильнее всего и раньше всего. Опишите сущности и связи в начале — и половина архитектуры встанет правильно сама. ORM — лишь переводчик; качество перевода зависит от качества вашего чертежа.

Что это даёт на практике

Фраза агента → что он имеет в виду

«Опишу модели в Prisma»
Задам сущности и связи в схеме-файле; Prisma сама создаст таблицы в базе и сгенерирует код для запросов.
«Сделаем миграцию»
Применю изменение структуры базы под обновлённую модель данных — например, добавлю новое поле или новую таблицу. Данные не удаляются.
«Связь один-ко-многим»
У одной записи много связанных: один пользователь — много заказов; один проект — много задач.
«Тут запрос N+1»
Приложение неэффективно дёргает базу в цикле: сначала один запрос, потом N отдельных. Надо попросить связанные данные одним запросом — это решается через ORM-параметр «include» или «join».

Модель данных — описание сущностей приложения, их полей и связей; «чертёж» данных.

Сущность (entity) — тип объекта: пользователь, заказ, товар; обычно соответствует одной таблице в базе.

Связь (relationship) — отношение между сущностями: один-ко-многим, многие-ко-многим, один-к-одному.

ORM — инструмент-«переводчик» между объектами в коде и таблицами базы данных (Prisma, Drizzle); избавляет от ручного SQL.

Миграция (migration) — управляемое изменение структуры базы данных при изменении модели. Применяется командой агента, не удаляет существующие данные.

Проверьте себя

Четыре вопроса с мгновенной проверкой

1. Что такое «модель данных»?

2. Зачем нужен ORM?

3. «У пользователя много заказов, у заказа — один пользователь» — это какая связь?

4. Агент говорит «нужна миграция». Что это значит?

Куда мы идём

Программа курса — 7 блоков