То, что вы обсуждаете, это система бронирования. Способ, которым я построил такие системы, состоит в том, чтобы иметь стол резервирования и стол мест.
Create Table Reservations
(
EventId ... not null References Events ( Id )
, SeatNumber varchar(10) not null
, Expiration datetime not null
, CustomerId ... not null References Customers( Id )
, Constraint FK_Reservations_Seats
Foreign Key( EventId, SeatNumber )
References EventSeats( EventId, SeatNumber )
)
Create Table EventSeats
(
EventId ... References Events ( Id )
, SeatNumber varchar(10) not null
, CustomerId ... null References Customers( Id )
, PurchaseDate datetime not null
)
Когда кто-то делает бронирование, вы вносите вкладку в таблицу «Резервирование» со значением даты и времени через определенный промежуток времени в будущем. Когда вы ищете свободные места, ваш запрос выглядит следующим образом:
Select S.EventId, S.SeatNumber
From EventSeats As S
Where S.EventId = ...
And S.CustomerId Is Null
And Not Exists (
Select 1
From Reservations As R
Where R.EventId = S.EventId
And R.SeatNumber = S.SeatNumber
And R.Expiration > CURRENT_TIMESTAMP
)
Это позволяет кому-либо временно удерживать сиденье, если он этого хочет. Если они хотят приобрести места, вы вставляете еще одну запись о бронировании на какой-то период в будущем. Фактически, система, которую я разработал, вставляла новое бронирование на каждом этапе процесса покупки, который был через 10 минут в будущем, просто чтобы помочь пользователю завершить процесс покупки до истечения срока бронирования. Когда они завершат покупку, вы обновите таблицу EventSeats, указав их информацию, и теперь это место занято навсегда.