Ik schets voor jullie de volgende situatie:
Een wedstrijd heeft meerdere categorieën.
Teams kunnen aan 1 of meerdere categorieën meedoen
Er zijn 6 categorieën, maar niet iedere categorie hoeft aanwezig te zijn bij een wedstrijd
De link tussen een categorie en een team is een participatie. Dit is een rijke veel-op-veel relatie, waarbij de behaalde plaats genoteerd wordt
Voorbeeldje:
Team X is 3e geworden in de categorie 'time trial' van wedstrijd Y
Team X is 6e geworden in de categorie 'stunts' van wedstrijd Y
Hieraan is een punten systeem gekoppeld. Iedere behaalde participatie levert een bepaalde hoeveelheid punten op volgens een 'fading scale'. Dit houd in dat een eerste plaats die vorige week behaald is meer punten oplevert dan een eerste plaatst die vorig jaar behaald is.
Het gaat om een schaal van 2 jaar. Alle behaalde resultaten ouder dan dat leveren 0 punten op. De punten 'degradatie' is hardcoded door middel van modifiers over blokken van 8 weken.
Voorbeeldje:
1ste plaats geeft 15 punten.
De eerste 8 weken na het behalen geeft dit 15 punten
Na 8 weken is dit gezakt naar (15*0.835) punten
Na 16 weken is dit gezakt naar (15*0.546) punten
...etc.
Dit complexe systeem werkt aardig in mijn Rails applicatie (lees: PHP website, als je Rails niet kent) en ik kan vrij simpel en direct aan één team zijn huidige score vragen (of zijn score op een willekeurig tijdstip).
Met 1 query heb ik alle participaties en die kan ik stuk voor stuk om hun score vragen op basis van een tijdstip.
Het probleem dat ik echter heb zijn de ranking charts, notabene het belangrijkste deel van de website. Om te kijken welk team de hoogste score heeft, moet ik bovenstaande van ALLE teams uitrekenen. Dit is niet te doen on-the-fly en kost te veel tijd.
Aangezien de scores 1x per week bijgewerkt worden en niet continue, heb ik een lapmiddel geschreven waar ik zelf niet helemaal tevreden mee ben:
Als de beheerder in het weekend zijn scores heeft ingevoerd, kan hij een 'rankings indexer' starten die vervolgens voor ieder team de score gaat berekenen op basis van de laatste maandag van de week. Hiervoor worden per team, per categorie, per week records aangemaakt die ik vervolgens kan sorteren op score (puntenaantal) en in de juiste volgorde weergeven.
Vanwege de grootte van de dataset duurt deze wekelijkse index actie ongeveer 30-45 minuten. Nu is gezien de aard van de website dit geen ramp, maar ik zou het graag op een nettere manier opgelost zien. Een bijkomend probleem is nu dat er verschillende normalisatie regels overtreden worden (redundantie) om de performance reëel te houden.
Ik ben erg benieuwd hoe jullie dit probleem zouden aanpakken! Graag hoor ik jullie creatieve geesten hierover gebogen worden.
[EDIT]
Een schets van de orde van grootte binnen deze dataset:
5000 Teams
1500 Wedstrijden
6 Categorieën
Een wedstrijd heeft meerdere categorieën.
Teams kunnen aan 1 of meerdere categorieën meedoen
Er zijn 6 categorieën, maar niet iedere categorie hoeft aanwezig te zijn bij een wedstrijd
De link tussen een categorie en een team is een participatie. Dit is een rijke veel-op-veel relatie, waarbij de behaalde plaats genoteerd wordt
Voorbeeldje:
Team X is 3e geworden in de categorie 'time trial' van wedstrijd Y
Team X is 6e geworden in de categorie 'stunts' van wedstrijd Y
Hieraan is een punten systeem gekoppeld. Iedere behaalde participatie levert een bepaalde hoeveelheid punten op volgens een 'fading scale'. Dit houd in dat een eerste plaats die vorige week behaald is meer punten oplevert dan een eerste plaatst die vorig jaar behaald is.
Het gaat om een schaal van 2 jaar. Alle behaalde resultaten ouder dan dat leveren 0 punten op. De punten 'degradatie' is hardcoded door middel van modifiers over blokken van 8 weken.
Voorbeeldje:
1ste plaats geeft 15 punten.
De eerste 8 weken na het behalen geeft dit 15 punten
Na 8 weken is dit gezakt naar (15*0.835) punten
Na 16 weken is dit gezakt naar (15*0.546) punten
...etc.
Dit complexe systeem werkt aardig in mijn Rails applicatie (lees: PHP website, als je Rails niet kent) en ik kan vrij simpel en direct aan één team zijn huidige score vragen (of zijn score op een willekeurig tijdstip).
Met 1 query heb ik alle participaties en die kan ik stuk voor stuk om hun score vragen op basis van een tijdstip.
Het probleem dat ik echter heb zijn de ranking charts, notabene het belangrijkste deel van de website. Om te kijken welk team de hoogste score heeft, moet ik bovenstaande van ALLE teams uitrekenen. Dit is niet te doen on-the-fly en kost te veel tijd.
Aangezien de scores 1x per week bijgewerkt worden en niet continue, heb ik een lapmiddel geschreven waar ik zelf niet helemaal tevreden mee ben:
Als de beheerder in het weekend zijn scores heeft ingevoerd, kan hij een 'rankings indexer' starten die vervolgens voor ieder team de score gaat berekenen op basis van de laatste maandag van de week. Hiervoor worden per team, per categorie, per week records aangemaakt die ik vervolgens kan sorteren op score (puntenaantal) en in de juiste volgorde weergeven.
Vanwege de grootte van de dataset duurt deze wekelijkse index actie ongeveer 30-45 minuten. Nu is gezien de aard van de website dit geen ramp, maar ik zou het graag op een nettere manier opgelost zien. Een bijkomend probleem is nu dat er verschillende normalisatie regels overtreden worden (redundantie) om de performance reëel te houden.
Ik ben erg benieuwd hoe jullie dit probleem zouden aanpakken! Graag hoor ik jullie creatieve geesten hierover gebogen worden.
[EDIT]
Een schets van de orde van grootte binnen deze dataset:
5000 Teams
1500 Wedstrijden
6 Categorieën