Вероятно, излишне для вашего приложения - но:
Относительно простым способом улучшения поиска за счет усложнения процесса записи будет изменение таблицы бронирования, чтобы сделать ее таблицей доступности.
Добавьте в логический столбец, чтобы указать, свободен ли слот или забронирован (или еще лучше указать идентификатор клиента, который его забронировал, и используйте 0, если слот свободен).
Начните с одного свободного слота, 1 января 2009 -> 31 декабря 20 ??
Когда вы получаете бронирование, разделите свободный слот на 3 (два вкладыша и одно обновление), забронированный слот и два доступных слота.
Продолжайте делать это, и по мере того, как временные рамки будут более фрагментированными, процесс бронирования будет состоять из одного из следующих действий:
- Назначение кому-либо всего «доступного слота» (одно обновление)
- Разделение «доступного слота» на два (одно обновление и одна вставка)
- Разделение слота на 3 (как указано выше), если кто-то заказывает среднюю секцию из доступного слота.
Управлять этим не так уж сложно, и процесс поиска становится простым запросом: поиск любых доступных временных интервалов в требуемом интервале времени (booked = false или customerid = 0, в зависимости от того, как вы это делаете) где enddate - startdate> = количество дней, которое вы хотите.
Это удваивает размер таблицы бронирования / доступности и делает заказы менее простыми, но компромисс в том, что процесс поиска так же прост, как и начинается.