Ich bin daran interessiert, diese Ranking-Klasse zu verwenden, basierend auf einem Artikel von Evan Miller , um eine Tabelle zu bewerten, die ich Upvotes und Downvotes hat. Ich habe ein System, das dem Up / Down-Abstimmungssystem von Stack Overflow für eine Veranstaltungsseite, an der ich gerade arbeite, sehr ähnlich ist, und durch die Verwendung dieser Ranking-Klasse habe ich das Gefühl, dass die Ergebnisse genauer sein werden. Meine Frage ist, wie ordne ich mit der Funktion 'hotness'?
%Vor%Ich nehme an, jedes Mal, wenn ein Benutzer abstimmt, könnte ich eine Spalte in meiner Tabelle haben, die die Schärfe-Daten für die neue Abstimmung neu berechnet hat, und nach dieser Spalte auf der Hauptseite sortieren. Aber ich interessiere mich dafür, dies on-the-fly zu tun, indem ich die obige Funktion einbeziehe, und ich bin mir nicht sicher, ob das möglich ist.
Von Evan Miller verwendet er:
%Vor%Aber ich mache diese Berechnung im SQL lieber nicht, da ich das Gefühl habe, dass es chaotisch und schwierig ist, die Zeile zu ändern, wenn ich diesen Code auf mehreren Seiten usw. verwende.
Sie haben Recht, eine Abfrage wie diese ist auch ziemlich unordentlich und teuer.
Mixed PHP / MySQL on-the-fly ist eine schlechte Idee, da Sie Werte für alle Posts auswählen und Hotness berechnen müssen und dann eine Liste der heißesten auswählen müssen. Extrem teuer.
Sie sollten mindestens einen Teil Ihrer Berechnung in der Datenbank speichern. Auf jeden Fall sollte die Bestellung in die Datenbank gehen. Es ist immer besser, etwas zu berechnen und nur einmal bei jedem Speichern / Aktualisieren zu speichern, anstatt jedes Mal, wenn es angezeigt wird, zu berechnen. Versuchen Sie einen Benchmark darüber zu erstellen, wie viel Zeit Sie sparen, indem Sie die Reihenfolge beim Speichern / Aktualisieren berechnen und nicht bei jeder Berechnung der Schärfe. Eine gute Sache ist, dass sich die Reihenfolge niemals ändert, es sei denn, jemand upvotes / upvotes, die Sie in der Datenbank speichern, trotzdem für das Zeichen.
Auch wenn Sie das Zeichen in der Datenbank speichern, können Sie die Berechnung aufgrund des Zeitstempel-Parameters nicht vermeiden.
Ich würde sehen, welchen Unterschied es macht und wo es einen Unterschied macht und Schärfe mit einem CLI-Skript jede x Zeitmenge nur für jene Skripte berechnen, wo dies entscheidend ist, jede Zeit, in der es weniger ausmacht .
Bei diesem Ansatz berechnen Sie die Schärfe nur bei Bedarf neu. Dies wird Ihre Anwendung viel effizienter machen.
Der Zugriff auf die entsprechende "Posts" -Tabelle für alles (Lesen, Schreiben, Sortieren, Vergleichen, usw.) ist extrem schnell und somit ist die Datenbank "die schnellste" Alternative, die Sie für nicht-temporäre haben Datenspeicherung (Speicher / Sitzungen sind noch schneller, können aber logischerweise nicht zum Speichern dieser Informationen verwendet werden).
Sie sollten sich mehr Sorgen darüber machen, einen guten Ranking-Algorithmus zu entwickeln, der die gewünschten Ergebnisse liefert (Sie schlagen zwei verschiedene Systeme vor, die unterschiedliche Ergebnisse liefern) und arbeiten daran, den gesamten Code und die Datenbankkommunikation so effizient wie möglich zu gestalten.
Im Prinzip bieten kleine Codes mit iterativen einfachen Befehlen die schnellste und zuverlässigste Lösung für diese Art von Situationen. Beispiel:
Ranking-Funktion (wie die erste, die Sie vorschlagen oder irgendeine andere, die auf den Ranglistenregeln aufbauen, die du willst) jedesmal aufgerufen a Abstimmung ist gegeben. Es schreibt in die entsprechende (n) Spalte (n) in der Tabelle "Posts" (je einfacher die Abfrage, desto besser: Sie können ein Ranking System so komplex wie Sie es wünschen, aber versuchen Sie sich auf PHP verlassen anstatt auf Abfragen).
Jedes Mal, wenn ein Vergleich zwischen Beiträgen erforderlich ist, wird die Tabelle "Posts" mit einem einfachen SELECT gelesen, der die Datensätze nach Rang sortiert (Sie können verschiedene "Bewertungsspalten" haben (z. B. Down-Stimmen, weitere Überlegungen); aber besser einen mit dem zu haben definitive Rangliste).
Ich bin mir nicht sicher, ob es mit Ihrer Datenbank und Ihrem Schema möglich ist. Haben Sie darüber nachgedacht, eine UDF für die benutzerdefinierte Sortierung zu schreiben?
Ein Post von stackoverflow spricht darüber, wie dies zu tun ist hier.