Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie ocen - optymalizacja
Forum PHP.pl > Forum > Bazy danych > MySQL
_tomek
Hej!

W wolnych chwilach piszę niedużą aplikację do robienia rankingów na podstawie ocen. Mam to rozpisane tak, że w tabeli "rates" mam id gry i wartość oceny. I teraz, chciałbym pobierać przy każdej grze wszystkie wpisy z danym id i wyciągać średnią, ale obawiam się, że przy dużej ilości takich wpisów, to nie da rady wydajnościowo. Jak inaczej mogę to rozwiązać? Myślałem, żeby zrobić w tabeli z grami kolumnę "rate" i tam zapisywać średnią liczoną w momencie, gdy ktoś oceni tę grę. Może macie inne pomysły?
Sephirus
Jeżeli masz dobrze skonstruowaną tabelę z wpisami, ocena jest liczbą to nie powinno być problemu - wystarczy używać zapytań w stylu:

  1. SELECT AVG(ocena) AS srednia FROM wpisy WHERE id = 123 --- i tak dalej


Jeżeli wpisów masz naprawdę dużo a do tego pojedynczy rekord jest duży (dużo pól, pola tekstowe itd...) dobrym rozwiązaniem było by utworzenie dodatkowej tabeli na przechowywanie samych ocen powiązanej do wpisów po id wpisu. Wówczas działania po takiej tabeli będą dużo szybsze.

Jeśli to jeszcze nie da rady - to nic nie stoi na przeszkodzie aby keszować te oceny w jakikolwiek sposób - tak by nie musiały być liczone przy każdorazowym wyświetleniu.

W ogóle moim zdaniem najprościej można dodać pole sumy ocen do samego rekordu gry bądź powiązanej z nim tabelki wraz z liczbą glosow:

ocena | glosow
60 12

I teraz przy każdym głosowaniu wykonujesz na tym jednym rekordzie "... SET ocena = ocena + [wybrana_ocena], glosow = glosow + 1 WHERE ..." smile.gif Średnia to zawsze:

  1. SELECT ocena/glosow AS srednia FROM tabelka WHERE id = [id_gry]


wink.gif
_tomek
Dzięki za odpowiedź!

Tabelę z ocenami mam taką: id | game_id | user_id | rate, więc o żadnych dużych polach nie ma mowy.

Na początku chciałem to zrobić tak, jak mówisz (pierwszy przykład - avg), ale właśnie, bałem się o wydajność.

Drugie rozwiązanie faktycznie miałoby sens, gdyby nie to, że chcę by każdy user mógł sprawdzić, jak co ocenił. Do tego musiałbym zakładać dwie tabele - jedną na relację user/ocena/gra i drugą gra/ocena/ilość ocen.

Wychodzi na to, że faktyczny wybór jest między tymi dwoma rozwiązaniami, pytanie tylko, które będzie mniej zasobożerne?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.