Ваша логика, приведенная выше, в значительной степени верна, однако хитрость заключается в том, что база данных должна хранить не комнаты, а промежутки свободного времени в комнате, поскольку каждая комната может иметь более одного промежутка, так как ваша основная таблица может содержать несколько записей за номер
Например, для начала предположим, что у вас есть в таблице
room start_avail end_avail
1 Jan 1 Mar 1
2 Feb 15 Mar 15
И кто-то заказывает комнату 1 на 2-15 февраля, теперь у вас есть
1 Jan 1 Feb 1
1 Feb 16 Mar 1
2 Feb 15 Mar 15
Когда поступает запрос, вы в основном сравниваете его с каждым интервалом свободного времени в базе данных и находите того, кто начинается в или до запрошенной даты начала и заканчивается в или после запрошенной даты окончания. После бронирования вы удаляете временной интервал из базы данных и вставляете оставшиеся неиспользованные временные промежутки (может быть 0 1 или 2 в зависимости от того, насколько подходящим было бронирование.
Если вы планируете показать пользователю все возможные комнаты и позволить им выбрать одну, все готово. Однако, если у вас есть контроль над тем, какую комнату выбрать, вам нужно будет рассмотреть эвристику, чтобы наилучшим образом использовать ресурсы комнаты. Например, эвристика «наилучшего соответствия» всегда выбирает номер, который оставляет наименьшее количество лишних бронирований, поэтому при бронировании на 1 день предпочтение отдается 2-дневному свободному промежутку, а не одному дню в середине двухнедельного периода и сокращению на два свободных места. В противном случае предположим, что 15 марта была свободна комната, а в марте - одна. Если бронирование пришло, он может использовать любую комнату. Но затем предположим, что кто-то пришел на сайт в поисках комнаты на весь март. Если при первом бронировании использовался второй номер, вы не сможете выполнить запрос.