Pewnie i jest to wystarczające.
Wchodząc w szczegóły:
Założyłem, że więcej jest odczytów z tabeli niż operacji zapisu do niej.
Tabela rezerwacji przechowuje daty początku i końca, ale istnieją dwie dodatkowe tabele.
Kod
bookings_calendar:
_attributes: { phpName: BookingEntry }
id:
apartment_id: { type: integer, required: true, foreignTable: apartments, foreignReference: id }
order_id: { type: integer, required: true, foreignTable: orders, foreignReference: id }
date: { type: date, required: true }
state: { type: tinyint, required: true, default: 1 }
type: { type: tinyint, required: true, default: 0 }
events: { type: integer, default: NULL, foreignTable: bookings_events, foreignReference: id }
skip: { type: boolean, default: false }
temp_bookings_calendar:
_attributes: { phpName: TempBookingEntry }
id:
apartment_id: { type: integer, required: true, foreignTable: apartments, foreignReference: id }
date: { type: date, required: true }
state: { type: tinyint, required: true, default: 1 }
session_id: { type: varchar, size: 128, required: true }
expire_date: { type: timestamp }
Służą one do sprawdzania dostępności i do rysowania kalendarza. Tabela temp_booking_calendar przechwuje tylko wstępne rezerwacje - klient zaznacza zakres dat, wypełnia formularz i otrzymuje stronę z prośbą o potwierdzenie. Jeśli potwierdzi (kliknie "tak, jestem pewien") dane sa przenoszone do tabeli bookings_calendar i oznaczane jako "oczekujące" - zazwyczaj chodzi o potwierdzenie wpłaty.
W zasadzie wyrysowanie kalendarza to pestka, bo powiedzmy, dla jednego miesiąca wyciągamy maksymalnie 62 rekordy i trzeba na nich tylko raz dokonać jakiejś obróbki, żeby było wiadomo, jaki obrazek podstawić w komórce tabeli.
Wada to jak wspomniałem, wyszukiwanie wolnych terminów - nie ma ich w bazie, więc trzeba wyciągnąć wszystkie rekordy z żądanego zakresu, utworzyć dodatkową tablicę ze wszystkimi datami i dopiero wtedy, w pętli zdejmować z niej te dni, które wyciągnęliśmy z bazy. To, co w niej zostanie, to dni wolne

Nie jest to zbyt wydajne, więc chyba spróbuję wykorzystać dane z tabeli zamówień, zgodnie z tym, cp napisałeś
Mało wydajne jest też wstawianie rekordów - w Propelu to masakra - nie polecam :/
Z samego efektu jestem jednak zadowolony.
http://img56.imageshack.us/img56/8348/cal3nt4.png (dodatkowo uzupełniłem o eventy)
Pozdrawiam