![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 31.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli masz dobrze skonstruowaną tabelę z wpisami, ocena jest liczbą to nie powinno być problemu - wystarczy używać zapytań w stylu:
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 ..." ![]()
![]() Ten post edytował Sephirus 1.06.2012, 07:45:59 -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 31.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 20:28 |