Dobre praktyki przechowywania danych mySQL

0

Witajcie,
piszę sobie małą stronkę do tworzenia turniejów w Fifę i zastanawia mnie kwestia przechowywania danych w tabelach. Każdy użytkownik będzie miał obliczane własny MMR ( ranking punktowy ) w taki sposób, że po każdym meczu będzie miał dodawane/odejmowane punkty. Będę miał oczywiście tabelę gdzie będą zapisywane wszystkie mecze, a pytanie jakie mam, to czy np. przy wyświetlaniu profilu, rankingów itp. zawsze obliczać MMR na bazie tabeli ze wszystkimi meczami czy stworzyć nowe pole użytkownika np. user_mmr i po każdym meczu robić update tego pola? Jaka jest dobra praktyka?

1

Zdecydowanie lepiej mieć osobne miejsce, gdzie będziesz miał zapisany ranking danego pacjenta. Podczas wyświetlania informacji o użytkowniku nie ma najmniejszego sensu zarzynać serwer koniecznością wykonywania obliczeń.

Zamiast tego, za każdym razem, gdy stanie się coś, co ma wpływ na ranking, aktualizujesz jego wartość w odpowiednim miejscu - czyli np. ktoś ma 120 pkt, ale wygrał mecz, w związku z tym dodajesz do jego rankingu ilość punktów, jaka przypada za wygranie (np. 10 pkt) i zapisujesz w tabeli nową wartość - czyli 130pkt. Analogicznie robisz z przegranymi.

Czasami możesz też zapuścić procedurę, która przeliczy wszystkie otrzymane punkty i porówna je z wartością wpisaną w tabeli z rankingiem. W ten sposób będziesz miał pewność, że nie pojawił się nigdzie błąd.

Taki sam mechanizm działa na 4P, tylko tutaj był mały "wyciek punktów", który zauważono przy okazji użytkownika @karolinaa. Dodała pewien wpis na blogu, za który dostała jakieś punkty. Potem wpis został usunięty, ale punkty za niego otrzymane nie przepadły. Zgłosiłem to @furious programming i w odpowiedzi dostałem:

Adam zaimplementował system reputacji w ten sposób, że owa liczba punktów nie jest powiązana z fizycznymi wpisami. System nie liczy punktów za każdym razem, kiedy frontend wymaga wyświetlenia tej liczby – dzięki temu system działa bardzo szybko, bo wyświetlenie licznika to pobranie jednej liczby z bazy. Usunięcie ocenionego wpisu nie aktualizuje licznika, a więc tutaj jest błąd w systemie – zgłoszę to w repozytorium.

Skoro 4Programmers stosuje taki system, to chyba jest najlepsza rekomendacja :D

1

Na logikę,

Zmieniać wartość jednego pola dla 2 użytkowników co mecz

Czy za każdym sprawdzeniem mmr (wejście na profil?) przeszukiwać np. 50 000 wpisów w bazie i wyliczać?

A gdyby 10/100/1000 osób ustawiło sobie bota żeby odświeżał jakiś/jakieś profil co 0.1/1/10sec, który by cały czas wyliczał te wartości?

0

Dzięki za wypowiedzi :)
@cerrato to jeszcze dopytam, lepiej tworzyć nowe pole w tabeli users czy może tworzyć nową tabelę user_ranking trzymającą id użytkownika i jest mmr ?

@WeiXiao tak, na logikę też oczywiście zmierzałem w tę stronę, ale nie jestem w tym biegły i może są praktyki trzymania tego w cache czy gdzieś, aby nie przeliczało się za każdym razem :) Wolałem się dopytać ;)

0

Jeśli to ma być tylko kolumna z ilością punktów i/lub druga z miejscem w rankingu, to ja bym nie robił tego w osobnej tabeli, tylko dołożył kolumnę do tabeli, w której masz inne dane o użytkowniku.

Ewentualnie można to rozbić na dwie tabele - jedna z rzeczami raczej rzadko się zmieniającym - typu login, imię, miasto, "kilka słów o mnie", data rejestracji itp, a druga z rzeczami dynamicznym typu ilość logowań, miejsce w rankingu, ilość meczy, data ostatniego logowania itp.

0

Dzięki za rady! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1