TGViewer
Data Science. SQL hub Data Science. SQL hub @sqlhub · 36K subscribers
Post #2488 3.1K
Два клиента одновременно бронируют один номер. Как не продать его дважды?

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

В PostgreSQL можно запретить пересечения прямо в базе:


CREATE EXTENSION IF NOT EXISTS btree_gist;

CREATE TABLE bookings (
room_id INT NOT NULL,
starts_at TIMESTAMPTZ NOT NULL,
ends_at TIMESTAMPTZ NOT NULL,

CHECK (ends_at > starts_at),

EXCLUDE USING gist (
room_id WITH =,
tstzrange(starts_at, ends_at, '[)') WITH &&
)
);


Как это работает:

room_id WITH = — проверяем брони одного номера.
WITH && — запрещаем пересечение временных интервалов.
'[)' — начало включено, конец исключён. Брони 10:00–11:00 и 11:00–12:00 допустимы.
CHECK — окончание должно быть позже начала.

Ограничение действует и при одновременных запросах. Две конфликтующие брони сохранить не получится: приложение должно обработать ошибку и сообщить, что время уже занято.

Подходит для гостиниц, переговорных, аренды оборудования и записи к специалистам.
  • 👍 19
  • ❤ 4
  • 🔥 2
More from @sqlhub
  1. Sep 18, 2026🔥 PostgreSQL 19 задерживается релиз может сдвинуться на несколько недель или даже месяцев…
  2. Sep 17, 2026Участвуй во всероссийском ИТ-чемпионате МТС True Tech Champ 2026 c призовой фондом 10 250…
  3. Sep 17, 2026📌 NY Post: Anthropic - это культ Профессор Вашингтонского университета Педро Домингос в и…
  4. Sep 16, 2026Post #2492
  5. Sep 16, 2026Стать специалистом по Data Science всего за 10 недель — это реально! Если давно смотрите в…
  6. Sep 15, 2026Oracle провела очередную волну сокращений, по сообщениям сотрудников, под увольнение попал…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →