Это не относится к языку, который вы используете, но я бы использовал SQL LEFT JOIN для этого.
По сути, этот тип объединения говорит о том, что вы знаете, что левая сторона присутствует (в данном случае таблица рассадки), но правая сторона (информация о бронировании) может отсутствовать, поэтому вы можете получить нулевые значения. Слева Соедините таблицу информации о месте с таблицей бронирования мест, выбрав производительность, для которой вы ищете информацию. В качестве конечного условия проверьте, не указана ли информация о бронировании, поскольку в этом случае место не было зарезервировано.
Это довольно быстро, если ваши таблицы SQL оптимизированы так, как они должны быть, и в результате вы получите ТОЛЬКО незарезервированные места, поэтому вам не нужно выполнять какую-либо фильтрацию в коде, и вы можете иметь SQL Сервер сделает тяжелую работу за вас. (Как правило, это самый эффективный способ сделать это)
Индекс, который вам нужен для ускорения, указывается в номере места и производительности в таблице информации о бронировании.
Вот общая форма этого запроса:
SELECT seat.* FROM seating seat LEFT JOIN bookings book ON seat.number = book.seat_number,book.performance = 'SOME PERFORMANCE ID' WHERE seat.venue = 'SOME VENUE' AND book.performance is null;
Попробуйте сначала без 'AND book.performance null', а также выберите таблицу бронирования, чтобы убедиться, что вы получаете все данные, и, что важно, только один ряд на место.