Обновить

Двойная бронь: как мы поймали гонку в записи и закрыли её EXCLUDE-констрейнтом

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.1K
Всего голосов 4: ↑1 и ↓3-2
Комментарии4

Комментарии 4

Обычный UNIQUE тут не подходит: нам нужна не «одинаковость», а пересечение интервалов времени.

У Вас часовые слоты?

Если да, то нет никакого "пересечения интервалов" и Y-m-d-H + mastername дадут UNIQUE.

Слоты не часовые — в этом и суть. Длительность услуги плавающая (маникюр 30 минут, окрашивание 2–3 часа), и старт не привязан к ровному часу. Поэтому брони пересекаются частично: запись на 13:00 длиной 90 минут (до 14:30) конфликтует с записью на 14:00, хотя усечение до Y-m-d-H даёт им разные ключи (13 и 14) — UNIQUE их пропустит. tstzrange + && ловит именно перекрытие интервалов разной длины. Ваш вариант отлично работал бы на фиксированной сетке одинаковых слотов — там пересечений не бывает и UNIQUE(master, slot) проще и честнее. Но с услугами переменной длительности сетки нет, поэтому нужен интервальный constraint.

Текст писала та же модель, что и код вашего приложения?

Алексей, буду рад обсудить вопрос о теме статьи.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации