Toon posts:

[DB/SQL] Tarieven volgens hierarchie opslaan en opvragen

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:
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 ]


Verwijderd

Gebruik CASE. Te vinden in de SQL-manual.

Beetje dezelfde werkwijze als SWITCH in PHP.

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 24 februari 2005 @ 11:12:
Gebruik CASE. Te vinden in de SQL-manual.

Beetje dezelfde werkwijze als SWITCH in PHP.
Ik kan me voorstellen dat dat als eerste te binnen schiet als je het probleem leest... volgens mij ligt het echter iets complexer. Tenminste, ik zie echt niet hoe je dit met een CASE statement kunt oplossen.