Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ranking i sprawa wydajności
spit
post
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 1.08.2005

Ostrzeżenie: (0%)
-----


Cześć.
Jak już pisałem na forum (może ktoś kojarzy) tworzę nieduży systemik do katalogowania i oceniania moich planszowych gier. Chciałbym, aby była możliwość oceniania ich przez odwiedzających (możliwe, że kiedyś to się rozrośnie (IMG:style_emoticons/default/smile.gif) ). W bazie mam tabelę "ratings", w której trzymam ocenę (pole ratings_rate) i identyfikator gry (ratings_gameid). Wpadłem na pomysł, by pobrać te dane do pliku i dodać im numery, tak:
  1. SELECT @i:=@i+1 nr, games_id, ratings_gameid, ratings_rate,
  2. COUNT(ratings_gameid) AS much,
  3. SUM(ratings_rate)/COUNT(ratings_gameid) AS all_ratings
  4.  
  5. FROM games
  6.  
  7. LEFT JOIN ratings ON games_id = ratings_gameid
  8.  
  9. GROUP BY games_id
  10. ORDER BY all_ratings DESC
Następnie wrzucam wynik do pliku, z niego robię tablicę, przy wywoływaniu listy gier includuje go, i biorę "nr" odpowiadający identyfikatorowi. Teraz pojawia się problem. Jeżeli założymy, że baza gier się rozrośnie (na początek będzie tam zbiór mój i kilku kolegów ze studiów) i wyniesie (luźno liczymy) 500 pozycji, to jak będzie z wydajnością? Chcemy zrobić więcej rankingów, m.in. wg wydawcy i roku wydania, to wszystko to są zapytania, pobierające przecież pięćset rekordów.

Pomyślałem, żeby pobieranie rankingu zrobić w CRONie, raz na dobę. Ale wówczas problemem będzie to, że sortuję wyniki przez średnią arytmetyczną ocen. Mógłbym zamiast umieszczać wyniki w pliku, dawać je do bazy, ale problem główny leży w tym, czy zwykłe konto na serwerze "wydoli" z częstą aktualizacją takich rankingów, powiedzmy... no, szczerze, to przy każdej oddanej ocenie. A może macie jakiś inny sposób na ranking sortowany wg ocen?

Korzystam z ADOdb, gdyby to miało w czymś pomóc.

Ten post edytował spit 19.07.2010, 21:44:43
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Chodzi o wyzwalacze bazy danych, nie kod php po stronie serwera. Tutaj wyzwalacz reagowałby na on insert dla tabeli ratings. Co do optymalizowania i pomysłu. Masz tabelę 'ratings'. Ma ona pola: id_gry, ocena i przynajmniej jeszcze jedno powinno być, by wyeliminować kilkukrotne głosowanie przez tego samego usera. Do tego dorzuciłbym tabelę game_summary z polami: id_gry, ilosc_glosow, srednia. Wyzwalacze zmieniały by wartości tych pól odpowiednio. Lepsze to niż count i avg za każdym razem.

EDIT: athabus był szybszy, ale chciałbym zwrócić uwagę na jedną rzecz... W przypadku gry najpewniej sama tabela podstawowych danych o grze będzie miała wiele kolumn, z których część nie jest konieczna do czytania za każdym razem i sensowne może być podzielenie jej na 2 lub 3 mniejsze, gdzie łącznikiem (kluczem) byłoby id_gry. Jako że dane gry jeśli chodzi o statystyki są pobierane zapewne często, to pod kątem optymalizacji wyciągnąłbym je do osobnej tabeli. Jeden JOIN LEFT by statystyki ewentualnie dołączyć do wyników głównej tabeli nie jest problemem.

A co do wywołań to oprócz triggerów, można jeszcze kombinować z eventami.
Powód edycji: [thek]: athabus był szybszy, ale dodam jeszcze coś ;)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 03:14