Beste tweakers,
ik ben bezig met een planningssysteem in PHP waarbij er medewerkers op klanten kunnen worden ingepland.
Dit kunnen eenmalige, wekelijkse en zelfs dagelijkse afspraken zijn.
Versimpeld zien deze afspraken er in de database als volgt uit:
- afspraken(afspraak_id, klant_id, medewerker_id, start_unix, eind_unix);
Nu moet er bij het inplannen van een afspraak gecheckt worden welke medewerkers er beschikbaar zijn (dus niet al ingepland zijn op hetzelfde tijdstip). Om dit te realiseren vraag ik het aantal overlappende afspraken op die binnen de start- en eindtijd van de nieuwe afspraak valt
Dit wordt in de huidige situatie gedaan d.m.v. één query
Bijvoorbeeld bij een enkele afspraak:
- SELECT count(afsprk_id), medewerker_id FROM afspraken WHERE 'nieuwe_start_unix' < eind_unix AND 'nieuwe_eind_unix> start_unix ;
Dit is dus de situatie bij een eenmalige afspraak, simpel dus.
Nu komt als volgt het probleem dat ik tegenkom; als er een afspraak wordt ingepland die wekelijks/dagelijks voor komt, kan deze query erg groot worden (omdat er per dag gekeken moet worden of er een afspraak binnen de tijdstippen valt).
Bijvoorbeeld:
SELECT count(afsprk_id), medewerker_id FROM afspraken WHERE ('dag1_start_unix' < eind_unix AND 'dag1_eind_unix> start_unix) OR ('dag2_start_unix' < eind_unix AND 'dag2_eind_unix> start_unix) OR ('dag3_start_unix' < eind_unix AND 'dag3_eind_unix> start_unix) OR ('dag4_start_unix' < eind_unix AND 'dag4_eind_unix> start_unix) etc tot de einddatum....
Dit werkt gewoon goed totdat de afspraken tabel goed gevuld is (boven de 100.000 rijen) en er veel verschillende medewerkers zijn.
De query die ontstaat doordat er bijvoorbeeld een dagelijkse afspraak wordt ingepland die tot december 2012 doorloopt zal zoals je ziet erg groot worden.
De query zal er dan erg lang over doen om de overlappingen op te vragen. In de praktijk kan dit bijna een minuut duren voordat de overlappingen zijn opgevraagd.
Nu is mijn vraag of er geen efficientere methode is om de overlappingen op te vragen dan deze hierboven omschreven? Op deze manier wordt de query namelijk wel erg groot. Maar het is toch nog altijd beter dan een heleboel minder grote queries?
ik ben bezig met een planningssysteem in PHP waarbij er medewerkers op klanten kunnen worden ingepland.
Dit kunnen eenmalige, wekelijkse en zelfs dagelijkse afspraken zijn.
Versimpeld zien deze afspraken er in de database als volgt uit:
- afspraken(afspraak_id, klant_id, medewerker_id, start_unix, eind_unix);
Nu moet er bij het inplannen van een afspraak gecheckt worden welke medewerkers er beschikbaar zijn (dus niet al ingepland zijn op hetzelfde tijdstip). Om dit te realiseren vraag ik het aantal overlappende afspraken op die binnen de start- en eindtijd van de nieuwe afspraak valt
Dit wordt in de huidige situatie gedaan d.m.v. één query
Bijvoorbeeld bij een enkele afspraak:
- SELECT count(afsprk_id), medewerker_id FROM afspraken WHERE 'nieuwe_start_unix' < eind_unix AND 'nieuwe_eind_unix> start_unix ;
Dit is dus de situatie bij een eenmalige afspraak, simpel dus.
Nu komt als volgt het probleem dat ik tegenkom; als er een afspraak wordt ingepland die wekelijks/dagelijks voor komt, kan deze query erg groot worden (omdat er per dag gekeken moet worden of er een afspraak binnen de tijdstippen valt).
Bijvoorbeeld:
SELECT count(afsprk_id), medewerker_id FROM afspraken WHERE ('dag1_start_unix' < eind_unix AND 'dag1_eind_unix> start_unix) OR ('dag2_start_unix' < eind_unix AND 'dag2_eind_unix> start_unix) OR ('dag3_start_unix' < eind_unix AND 'dag3_eind_unix> start_unix) OR ('dag4_start_unix' < eind_unix AND 'dag4_eind_unix> start_unix) etc tot de einddatum....
Dit werkt gewoon goed totdat de afspraken tabel goed gevuld is (boven de 100.000 rijen) en er veel verschillende medewerkers zijn.
De query die ontstaat doordat er bijvoorbeeld een dagelijkse afspraak wordt ingepland die tot december 2012 doorloopt zal zoals je ziet erg groot worden.
De query zal er dan erg lang over doen om de overlappingen op te vragen. In de praktijk kan dit bijna een minuut duren voordat de overlappingen zijn opgevraagd.
Nu is mijn vraag of er geen efficientere methode is om de overlappingen op te vragen dan deze hierboven omschreven? Op deze manier wordt de query namelijk wel erg groot. Maar het is toch nog altijd beter dan een heleboel minder grote queries?