Mungkin berlebihan untuk aplikasi Anda - tetapi:
Cara yang relatif sederhana untuk meningkatkan pencarian Anda dengan mengorbankan proses 'menulis' menjadi lebih rumit, adalah dengan mengubah tabel Pemesanan menjadi tabel 'Ketersediaan'.
Tambahkan kolom boolean untuk menunjukkan apakah slot kosong atau dipesan (atau lebih baik tetap masukkan id pelanggan yang memesannya, dan gunakan 0 jika slot kosong).
Mulailah dengan satu slot gratis, 1 Jan 2009 -> 31 Des 20??
Saat Anda mendapatkan pemesanan, bagi slot gratis menjadi 3 (dua sisipan dan satu pembaruan), slot yang dipesan dan dua slot yang tersedia.
Terus lakukan itu dan seiring dengan semakin terfragmentasinya kerangka waktu, proses pemesanan akan terdiri dari salah satu dari berikut ini:
- Menetapkan seluruh 'slot yang tersedia' kepada seseorang (satu pembaruan)
- Membagi 'slot yang tersedia' menjadi dua (satu pembaruan dan satu sisipan)
- Membagi slot menjadi 3 (seperti di atas) jika seseorang memesan bagian tengah dari slot yang tersedia.
Itu tidak terlalu rumit untuk dikelola dan proses pencarian menjadi kueri sederhana:menemukan slot apa pun dalam kerangka waktu yang diperlukan yang tersedia (booked=false atau customerid=0, ke mana pun Anda pergi) di mana tanggal akhir - tanggal mulai>=nomor hari yang Anda inginkan.
Ini menggandakan ukuran tabel pemesanan/ketersediaan, dan membuat pemesanan menjadi lebih sederhana, tetapi keuntungannya adalah proses pencarian semudah yang didapat.