Как реализовать систему бронирование для отеля?
=================================================

 Условно в отеле есть перечень номеров (номер1, номер2, номер3 и т.д.), у некоторых номеров есть типы (Тип1, Тип2).  

При бронировании планирую создавать записи, например:  

03.11.2019 Номер1 Тип2 Занято  

06.11.2019 Номер2 Тип2 Занято  

08.11.2019 Номер1 Тип1 Занято  

11.11.2019 Номер3 ------ Занято  

и т.д.  
  

А вот дальше не очень понимаю, как на заданный диапазон дат узнать какие номера свободны, например узнать свободные номера с 01.11.2019 по 15.11.2019.  
  

Из идей есть следующие:  
  

№1  

1) взять все номера  

2) взять все бронирования на одно число (01.11.2019)  

3) сопоставить два списка, полученных ранее, и исключить забронированные на это число номера, таким образом получу свободные номера  

4) проделывать данный алгоритм для каждого дня для интервала из запроса т.е. с 01.11.2019 по 15.11.2019  
  

№2  

Изначально хранить данные в другом виде, для всех номеров всех типов на каждый день должны быть запись вида  

01.11.2019 Номер1 Тип1 Свободно  

или  

01.11.2019 Номер1 Тип1 Занято  

Тогда делаю запрос по интервалу с 01.11.2019 по 15.11.2019 и статусом свободно.  

Этот вариант мне кажется избыточным и не очень понимаю, когда принимать решение о генерации таких записей, т.е. раз в год создавать на целый год вперед? И при добавлении нового номера или типа для него надо генерировать эти записи.  
  

Какие еще существую варианты решения задачи бронирования? Также интересуют замечания по предложенным вариантам.  

Реализовывать буду на php для битрикса. 

 Я тут немного нашКодил на ночь глядя:  
  

```
<?php

// Желаемые даты
$date_arrive = '01.01.2000'; 
$date_depart = '03.01.2000';

// Создаем массив "дней".
$booking = range(strtotime($date_arrive) / 86400, strtotime($date_depart)  / 86400);

// Диапазон дат из базы когда номер забронирован (не доступен).
$closed = range(strtotime('02.01.2000') / 86400, strtotime('05.01.2000')  / 86400);

// Изначально статус "свободен".
$status = 1;

foreach($closed as $c){
	// Если находит пересечение дат то статус "занят, бронь невозможна".
	if(in_array($c, $booking)){
	$status = 0;
	}
}

echo $status;
```
  

Но тут еще надо предусмотреть перебор периодов из базы когда номер занят, это я не стал писать.