häufigste Zugriffe

  • Hallo zusammen,


    ich stehe vor einem kleinen Problem. Ich habe auf einer Webseite ein Suchfeld für bestimmte Datenbankeinträge. Die Situation selber, ist folgende:

    Ich speichere für E-Mails einzelne Vorlagen. Jede Vorlage hat eine ID, einen Namen und einen Inhalt (hier: HTML-Code). Wenn man eine neue E-Mail erstellt, kann man diese entweder selber schreiben, oder aber eine Vorlage reinkopieren. Dazu habe ich im WSC ein Dialog erstellt mit Suchfeld. Die suche selber funktioniert soweit eigentlich gut. Ich wollte jetzt aber beim Aufruf des Dialogs häufig verwendete Vorlagen als Ergebnis vorladen. Und da kommen wir jetzt zum Thema, weshalb das ganze in SQL landet:


    Ich suche nach einer Möglichkeit mir die 5 (oder 10, weiß die genaue Zahl gerade nicht, ist aber ohnehin konfigurierbar) in der letzten Zeit meistgenutzten Vorlagen auszugeben.

    Dabei sollen insb. folgende Probleme vermieden werden:

    1. Neue Vorlagen sollen höher gewichtet werden, als alte. Sonst habe ich eine Vorlage die 3 Jahre alt ist und 10 Mal verwendet wurde und eine, die 1 Tag alt ist und schon 9 Mal verwendet wurde, die ist aber nicht in der Liste.
    2. Gleichzeitig dürfen alte Vorlagen aber auch nicht wenigster stark gewichtet werden als neue, wenn diese häufig verwendet werden. Wenn wir das Beispiel aus 1. nehmen, so könnten 9 der 10 Aufrufe von der 3 Jahre alten Vorlage auch erst seit gestern geschehen sein. Sie wäre also Ähnlich stark gewichtet wie die neue Vorlage
    3. Das Alter einer Vorlage sollte erstmal keine zu große Rolle spielen.

    Um erstmal Problem 1 zu beheben, hatte ich an eine Funktion mit beschränktem Wachstum gedacht. Der maximale Score einer Vorlage ist z.B. 10. Eine neue Vorlage fängt mit einem Score kleiner als 10 an, aber auch mit einem Score größer als 1. Dann würde ich 1 als Minimum für den Score festlegen.

    Wird auf eine Vorlage zugegriffen, bzw. wird die Vorlage zum Versand einer E-Mail verwendet, wird ihr Score anhand dieser Funktion erhöht. Zuerst stark ansteigend, später natürlich schwächer., asymptotisch an den Score 10.

    Wenn wir basierend darauf einmal im Monat noch den Score aller Vorlagen um einen gewissen Prozentsatz (oder anhand der Umkehrfunktion) reduzieren, dürften auch die Probleme 2 und 3 behoben werden. So dürften neue Vorlagen schnell aufsteigen können, während alte häufig verwendete Vorlagen ebenfalls einen hohen Score behalten. Lange nicht verwendete Vorlagen fallen dann nach und nach im Score und dürften somit auch recht schnell nicht mehr in den Top 10 Vorlagen zu finden sein.


    Jetzt ist natürlich die Frage, ob es schlau ist, das so zu machen. Man könnte auch jede Nutzung einer Vorlage einfach extra in einer Tabelle speichern und dort dann im Intervall die Werte rausnehmen, die älter als z.B. 3 Monate sind. Dann könnte man anhand dessen auch einen gewissen Score erzielen. Das allerdings verbraucht natürlich mehr Speicher, als eine Zahl extra bei den Vorlagen und ist beim auslesen und sortieren etwas aufwändiger (aufgrund des Joins in die andere Tabelle), gleichzeitig aber auch besser einsehbar, was genau passiert.


    Die oben vorgestellte Möglichkeit bietet natürlich den Nachteil, dass dann bei jedem Zugriff auf eine Vorlage auch der Wert neu berechnet werden muss. Ein zurücksetzen einzelner Werte passiert in beiden Fällen, ist also fast nicht großartig ausschlaggebend, außer dass bei der ersten Lösung der Wert berechnet werden muss, wohingegen bei Lösung 2 nur die alten Daten aus der Tabelle gelöscht werden können.


    Ich lasse das jetzt erstmal so stehen und bin mal gespannt, welche Idee ihr bevorzugen würdet. Was würdet ihr anders machen? Oder würdet ihr einen gänzlich anderen Weg wählen?


    Viel Spaß beim Diskutieren.

    Marc