Aktualizacja w czasie rzeczywistym względnej tabeli liderów dla każdego użytkownika wśród znajomych

Pracowałem nad funkcją mojej aplikacji, aby zaimplementować tabelę liderów - w zasadzie stosuj ranking użytkowników według ich wyniku. Obecnie śledzę wynik indywidualnie. Uważam, że ta tablica wyników powinna być względna, a nie bezwzględna, tj. Zamiast 10 najlepszych użytkowników o najwyższych wynikach w całej witrynie, czyli 10 najlepszych wśród sieci znajomych użytkownika. Wydaje się to lepsze, ponieważ każdy ma szansę być # 1 w swojej sieci i istnieje forma przyjaznej rywalizacji dla tych, którzy są zainteresowani tego typu rzeczami. Już zapisuję wynik dla każdego użytkownika, więc wyzwaniem jest jak skutecznie obliczyć rangę tego wyniku w czasie rzeczywistym. Używam Google App Engine, więc są pewne korzyści i ograniczenia (np. Zapytania IN [tablica]) wykonują pod-zapytanie dla każdego elementu tablicy, a także są ograniczone do 30 elementów na instrukcję

Na przykład

1st Jack 100

2nd John 50

Oto podejścia, które wymyśliłem, ale wszystkie wydają się być nieefektywne i pomyślałem, że ta społeczność może wymyślić coś bardziej eleganckiego. Mam wrażenie, że każde rozwiązanie będzie prawdopodobnie wykonane za pomocą crona i że będę przechowywać codzienną rangę i listę w celu optymalizacji operacji odczytu, ale byłoby fajnie, gdyby istniało coś bardziej lekkiego i czasu rzeczywistego

Wyciągnij listę wszystkich użytkowników strony uporządkowanej według wyniku. Dla każdego użytkownika wybierz jego przyjaciół z tej listy i utwórz nowe rankingi. Zapisz kolejność rang i list. Aktualizuj codziennie. Wady - Jeśli dostanę wielu użytkowników, zajmie to wieczność

2a. Dla każdego użytkownika wybierz ich przyjaciół i dla każdego przyjaciela wybierz wynik. Sortuj tę listę. Zapisz kolejność rang i list. Aktualizuj codziennie. Zapisz ostatnią pozycję każdego użytkownika, aby wcześniej istniejąca lista mogła zostać użyta do ponownego zamówienia kolejnej aktualizacji w celu zwiększenia jej skuteczności (może zaoszczędzić czas sortowania)

2b. Tak samo jak powyżej, z wyjątkiem obliczania kolejności i listy osób, których profile zostały wyświetlone w ostatnim dniu Cons - pozycja jest aktualna tylko dla drugiej osoby, która ogląda profil

questionAnswers(2)

yourAnswerToTheQuestion