Op een project lopen we tegen een probleem aan wat met tarieven van medewerkers op projecten te maken heeft. Ik heb het probleem voor de overzichtelijkheid iets versimpeld. De logica:
Er zijn 3 entiteiten waarvoor tarieven gedefinieerd kunnen worden; projecten, klanten, en medewerkers.
Een project heeft een klantID.
Zo kan er een algemeen projecttarief gedefinieerd worden. Er kan per medewerker op een project een tarief gedefinieerd worden.
Per klant kan een algemeen tarief gedefinieerd worden, en er kan per medewerker een tarief voor die klant gedefinieerd worden.
Tot slot kan er een algemeen medewerkerstarief gedefinieerd worden.
Het probleem: Gegeven een projectID en medewerkerID, geef het geldende tarief terug.
Het geldende tarief wordt als volgt bepaald:
Momenteel hebben we 1 tarieven tabel waarin alle soorten tarieven opgeslagen staan. Deze heeft (versimpeld) de volgende velden:
Een projecttarief sla je bijvoorbeeld op door het veld ProjectID te vullen, maar de velden KlantID en MedewerkerID op <NULL> te zetten.
Het probleem hierbij is, hoe haal ik (gegeven een ProjectID en een MederwerkerID) efficient mbv SQL het geldende tarief op. Momenteel is de enige oplossing die ik zie uit uitvoeren van maximaal 5 SELECT queries die volgens bovengenoemde hierarchy steeds een tarief probeert te vinden.
Dit is uitermate traag. Als je het 1x doet valt dat niet zo op, maar voor een hele reeks boekingen op een reeks projecten loopt dit uit de klauwen. Om verwarring te voorkomen: het tarief kan niet bij het aanmaken van de de boeking opgeslagen worden. Dit wordt pas bij de facturering vastgesteld.
Mijn vraag dus: hoe dit te versnellen? Is het datamodel misschien onjuist? Of is er een efficientere manier die volgens de bovengenoemde hierarchy het juiste tarief ophaalt? Bvd
Er zijn 3 entiteiten waarvoor tarieven gedefinieerd kunnen worden; projecten, klanten, en medewerkers.
Een project heeft een klantID.
Zo kan er een algemeen projecttarief gedefinieerd worden. Er kan per medewerker op een project een tarief gedefinieerd worden.
Per klant kan een algemeen tarief gedefinieerd worden, en er kan per medewerker een tarief voor die klant gedefinieerd worden.
Tot slot kan er een algemeen medewerkerstarief gedefinieerd worden.
Het probleem: Gegeven een projectID en medewerkerID, geef het geldende tarief terug.
Het geldende tarief wordt als volgt bepaald:
code:
1
2
3
4
5
| Als er voor het gegeven project voor de gegeven medewerker een tarief bestaat, geef deze terug Anders, als er voor het gegeven project een tarief bestaat, geef deze terug Anders, als er voor de klant van het gegeven project een tarief voor de gegevn medewerker bestaat, geef deze terug Anders, als er voor de klant van het gegeven project een tarief bestaat, geef deze terug Anders, geef het algemene medewerker tarief terug |
Momenteel hebben we 1 tarieven tabel waarin alle soorten tarieven opgeslagen staan. Deze heeft (versimpeld) de volgende velden:
code:
1
2
3
4
5
| - TariefID integer <PK> - ProjectID integer NULLABLE - KlantID integer NULLABLE - MedewerkerID integer NULLABLE - Tarief float |
Een projecttarief sla je bijvoorbeeld op door het veld ProjectID te vullen, maar de velden KlantID en MedewerkerID op <NULL> te zetten.
Het probleem hierbij is, hoe haal ik (gegeven een ProjectID en een MederwerkerID) efficient mbv SQL het geldende tarief op. Momenteel is de enige oplossing die ik zie uit uitvoeren van maximaal 5 SELECT queries die volgens bovengenoemde hierarchy steeds een tarief probeert te vinden.
Dit is uitermate traag. Als je het 1x doet valt dat niet zo op, maar voor een hele reeks boekingen op een reeks projecten loopt dit uit de klauwen. Om verwarring te voorkomen: het tarief kan niet bij het aanmaken van de de boeking opgeslagen worden. Dit wordt pas bij de facturering vastgesteld.
Mijn vraag dus: hoe dit te versnellen? Is het datamodel misschien onjuist? Of is er een efficientere manier die volgens de bovengenoemde hierarchy het juiste tarief ophaalt? Bvd
[ Voor 4% gewijzigd door Verwijderd op 24-02-2005 11:10 ]