Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 472новые вакансии за сутки·93 728вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 124
  • Облачные технологии14 081
  • QA вакансии3 459
  • Backend вакансии2 116
  • Инженер данных1 804
  • Продакт-менеджер1 264

Разработка

  • Android1 866
  • iOS1 701
  • Fullstack вакансии988
  • AI вакансии952
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 662
  • Java6 548
  • Node.js2 019
  • .NET1 722
  • Kotlin1 619
  • Rust1 454
  • C#711
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 766
  • DevOps вакансии6 053
  • Linux-инфраструктура5 491
  • Terraform / IaC4 262
  • CI/CD3 242
  • Мониторинг и Observability1 787
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 297
  • Вакансии в Европе23 854
  • Вакансии в Канаде4 476
  • Работа в России3 921

По формату

  • Удалённые вакансии75 046
  • Релокация в США44 297
  • Гибридная работа12 398
  • Офисная работа7 076

По уровню

  • Senior вакансии42 676
  • Middle вакансии20 894
  • Junior вакансии6 725

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PrismaВсе вопросы
PrismaMiddleТеория

Как работает пагинация в Prisma? В чём разница между offset-based и cursor-based пагинацией?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Prisma поддерживает offset-пагинацию через skip/take (аналог SQL LIMIT/OFFSET) и cursor-пагинацию через cursor/take (поиск по индексу, без OFFSET). Cursor быстрее на больших таблицах, offset удобнее для постраничной навигации.

Offset-based пагинация

Параметры skip (сколько строк пропустить) и take (сколько взять) — прямой аналог SQL OFFSET ... LIMIT ...:

const PAGE_SIZE = 20;

async function getPostsPage(page: number) {
  const [posts, total] = await prisma.$transaction([
    prisma.post.findMany({
      skip: (page - 1) * PAGE_SIZE,
      take: PAGE_SIZE,
      orderBy: { createdAt: 'desc' },
    }),
    prisma.post.count(),
  ]);

  return {
    posts,
    total,
    totalPages: Math.ceil(total / PAGE_SIZE),
    currentPage: page,
  };
}

// использование
const result = await getPostsPage(3); // страница 3

Плюсы: простота, возможность прыгнуть на любую страницу, счётчик общего числа записей. Минусы: при большом OFFSET PostgreSQL всё равно перебирает пропускаемые строки — запрос замедляется при page > 1000.

Пагинация в Prisma

Prisma поддерживает два вида пагинации: классическую offset-based (через skip и take) и cursor-based (через cursor и take). Выбор между ними зависит от требований к производительности и UX.

Cursor-based пагинация

Cursor указывает на конкретную запись (обычно по id или createdAt). Вместо OFFSET база ищет строки после курсора через индекс — это O(log n) вместо O(n):

async function getPostsCursor(cursor?: number, take = 20) {
  const posts = await prisma.post.findMany({
    take,
    // пропустить сам курсор и взять следующие записи
    ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
    orderBy: { id: 'asc' },
  });

  const nextCursor =
    posts.length === take ? posts[posts.length - 1].id : undefined;

  return { posts, nextCursor };
}

// первая страница
const page1 = await getPostsCursor();
// следующая страница
const page2 = await getPostsCursor(page1.nextCursor);

Двунаправленная cursor-based пагинация

async function getPostsBidirectional({
  cursor,
  direction = 'forward',
  take = 20,
}: {
  cursor?: number;
  direction?: 'forward' | 'backward';
  take?: number;
}) {
  const posts = await prisma.post.findMany({
    take: direction === 'backward' ? -take : take,
    ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
    orderBy: { id: 'asc' },
  });

  return {
    posts,
    prevCursor: posts[0]?.id,
    nextCursor: posts[posts.length - 1]?.id,
  };
}

Когда что использовать

  • Offset: таблицы с кнопками страниц, административные панели, отчёты, поиск с фиксированным числом результатов. Удобно, когда пользователь хочет перейти на страницу 5 из 20.
  • Cursor: бесконечная прокрутка (infinite scroll), real-time фиды (Twitter, Instagram), API с высокой нагрузкой, таблицы с миллионами строк.

Подводные камни

  • При offset-based пагинации в активно меняющейся таблице возможны дубликаты или пропуски строк между страницами: пока пользователь читает страницу 2, новая запись вставляется в начало и смещает всё.
  • Cursor должен быть уникальным и монотонным. Использование createdAt как курсора без дополнительного уникального поля может привести к дубликатам при одинаковых временных метках.
  • Параметр skip: 1 при cursor-запросе обязателен, чтобы не включать саму курсорную запись в результат. Без него курсор-запись будет возвращаться дважды.
  • Отрицательный take (для листания назад) работает только совместно с cursor и меняет направление обхода, что может сбить с толку.
  • Cursor-based пагинация не позволяет узнать общее число страниц без дополнительного count() запроса.
  • Cursor по составному уникальному ключу в Prisma требует передавать объект с несколькими полями: cursor: { username_tenant: { username, tenant } } — синтаксис неочевиден.
  • Если между запросами страниц удаляется курсорная запись, Prisma выбросит ошибку или вернёт пустой результат в зависимости от версии. Нужна обработка этого случая.

Частые вопросы на собеседовании

  • Как Prisma Client обеспечивает типобезопасность? Как генерируются типы?
  • Что такое транзакции в Prisma? Как использовать prisma.$transaction() для интерактивных и batch-транзакций?
  • Что такое Prisma Migrate? Чем отличаются prisma migrate dev и prisma migrate deploy?
  • Как определить связи один-к-одному, один-ко-многим и многие-ко-многим в Prisma?

Типичные ошибки

  • Путает Prisma Client API с гарантиями базы данных: индексы, блокировки и isolation level не создаются магически.
  • Не объясняет, где в lifecycle находится offset и cursor pagination.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

Что проверяет интервьюер

  • Может объяснить offset и cursor pagination на примере кода.
  • Называет ключевые API: skip, take, cursor.
  • Отделяет ORM/query builder поведение от реального поведения СУБД.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Как вы знаете этот вопрос?

Проверить себя по теме Prisma →

Источники

  • https://www.prisma.io/docs/orm/prisma-client/queries/pagination
←Предыдущий вопросКак оптимизировать запросы Prisma, чтобы избежать проблемы N+1?Следующий вопрос→Представьте, после изменения кода на Prisma выросло число SQL-запросов и latency. Как вы будете это доказывать и чинить?

Связанные темы

Prismaapi-designperformance-tuning