Sagen wir, ich habe ungefähr 1.000.000 Benutzer. Ich möchte herausfinden, in welcher Position sich ein bestimmter Benutzer befindet und welche Benutzer sich um ihn herum befinden. Ein Benutzer kann jederzeit eine neue Errungenschaft erhalten, und wenn er seine stehende Aktualisierung sehen könnte, wäre das wunderbar.
Ehrlich gesagt, jede Art und Weise, wie ich das mache, wäre in der Zeit und / oder im Gedächtnis schrecklich teuer. Ideen? Meine bisher beste Idee ist es, die Benutzer offline anzuordnen und Perzentil-Buckets zu erstellen, aber das kann einem Benutzer nicht seine genaue Position zeigen.
Irgendein Code, wenn dir das hilft, Leute zu django:
%Vor%Ich denke, Counterstrike löst das, indem es verlangt, dass Benutzer einen Mindestschwellenwert einhalten, um eine Rangfolge zu erhalten - Sie müssen nur die obersten 10% oder was auch immer genau sortieren.
Wenn Sie alle sortieren möchten, beachten Sie, dass Sie sie nicht perfekt sortieren müssen: Sortieren Sie sie in zwei signifikante Zahlen. Mit 1M Benutzern können Sie die Rangliste für die Top 100 Benutzer in Echtzeit aktualisieren, die nächsten 1000 Benutzer auf die nächsten 10, dann die Massen auf die nächsten 1% oder 10%. Sie werden in einer Runde nicht von Platz 500.000 auf Platz 99 springen.
Es ist bedeutungslos, den 10 Benutzerkontext oberhalb und unterhalb von 500.000 zu bekommen - die Ordnung der Massen wird aufgrund der exponentiellen Verteilung von Runde zu Runde unglaublich nervös.
Bearbeiten: Sehen Sie sich die SO-Bestenliste an. Gehen Sie nun zu Seite 500 von 2500 (ungefähr 20 Prozent). Ist es sinnvoll, den Leuten mit der Bemerkung zu sagen, dass die 10 Leute auf beiden Seiten von ihnen auch die '157' haben? Du wirst 20 Plätze auf jede Art springen, wenn dein Repräsentant einen Punkt nach oben oder unten geht. Extremer ist, dass die unteren 1056 Seiten (von 2538), oder die unteren 42% der Benutzer, mit rep 1. verbunden sind. Sie bekommen einen weiteren Punkt, und Sie sind aufgesprungen. 1055 Seiten . Das ist ungefähr eine 37.000 Steigerung im Rang. Es könnte cool sein ihnen zu sagen "Du kannst 37k Leute schlagen, wenn du noch einen Punkt bekommst!" aber spielt es eine Rolle, wie viele signifikante Zahlen die 37k-Nummer hat?
Es macht keinen Sinn, deine Kollegen auf einer Leiter zu kennen, bis du ganz oben bist, denn außer der Spitze gibt es eine überwältigende Anzahl von ihnen.
Eine Million ist nicht so viel, ich würde es zuerst einfach versuchen. Wenn die Eigenschaft points das Objekt ist, nach dem Sie sortieren, muss es sich um eine Datenbankspalte handeln. Dann kannst du einfach mehr Punkte zählen als die betreffende Person, um den Rang zu erhalten. Um andere Personen in die Nähe einer Person zu bringen, führen Sie eine Abfrage von Personen mit höheren Punkten durch und sortieren aufsteigend nach der Anzahl der gewünschten Personen.
Das Schwierige ist, die Punkte beim Speichern zu berechnen. Sie müssen die aktuelle Zeit als Bonusmultiplikator verwenden. Ein Punkt muss nun in eine Zahl umgewandelt werden, die weniger als 1 Punkt in 5 Tagen beträgt. Wenn Ihre Benutzer häufig Punkte sammeln, müssen Sie eine Warteschlange erstellen, um die Belastung zu bewältigen.
Tags und Links python django sql leaderboard