Probablemente sea excesivo para su aplicación, pero:
Una forma relativamente sencilla de mejorar sus búsquedas a expensas de hacer que el proceso de 'escritura' sea más complicado, sería cambiar la tabla de Reservas para convertirla en una tabla de 'Disponibilidad'.
Agregue una columna booleana para indicar si el espacio está libre o reservado (o mejor aún, ingrese la identificación del cliente que lo reservó y use 0 si el espacio está libre).
¿Empezar con un solo espacio libre, 1 de enero de 2009 -> 31 de diciembre de 20?
Cuando obtenga una reserva, divida el espacio libre en 3 (dos inserciones y una actualización), el espacio reservado y los dos espacios disponibles.
Siga haciendo eso y, a medida que el período de tiempo se fragmente más, el proceso de reserva consistirá en uno de los siguientes:
- Asignar un 'espacio disponible' completo a alguien (una actualización)
- Dividir un 'espacio disponible' en dos (una actualización y una inserción)
- Dividir un espacio en 3 (como arriba) si alguien reserva la sección central de un espacio disponible.
Eso no es increíblemente complicado de administrar y el proceso de búsqueda se convierte en una consulta simple:encontrar cualquier espacio en el marco de tiempo requerido que esté disponible (booked=false o customerid=0, de cualquier manera que elija) donde enddate - startdate>=el número de días que quieras.
Duplica el tamaño de la tabla de reserva/disponibilidad y hace que las reservas sean menos simples, pero la compensación es que el proceso de búsqueda es tan fácil como parece.