[mysql] Popularne kategorie/tematy na forum

Wstęp

Bardzo często na stronach można zobaczyć popularne kategorie niezależnie od tego czy są to kategorie wpisów, produktów czy zdjęć. Boks z takimi kategoriami pozwala pośrednio zwrócić uwagę indeksującym robotom na linki, którymi powinny się zająć w pierwszej kolejności. Dobrze napisany kod nie zakłóca działania całej strony. Kod napisany nieprawidłowo … no cóż, może spowodować wyświetlanie się białej strony, komunikatu 503 itp.

Zliczanie

Pierwszą rzeczą, na którą trzeba zwrócić uwagę, jest to, że same zliczenia powinny trafiać do osobnej tabeli niż dane kategorii. Nie może być to także tabela zawierająca dane meta powiązane z kategoriami. Najlepiej będzie zrobić osobną tabelę, która będzie służyła tylko i wyłącznie zliczaniu wejść do kategorii. Dla uproszczenia zróbmy ją jako kategorie_wejscia ( id_kategorii, flaga ). Każde wyświetlenie danej kategorii będzie wstawiało nowy rekord do tej tabeli. Nie przejmujemy się kluczami ani niczym innym. Gdy już mamy tą część gotową możemy przejść do kolejnego etapu.

Przetwarzanie wejść

Wiemy już co ludzie klikają, ale nie wiemy jeszcze ile tych kliknięć faktycznie jest. Dlatego też robimy kolejną tabelę kategorie_wejscia_liczba( id_kategorii, liczba ), do której w zadanych momentach będziemy przenosić dane z kategorie_wejścia. Pierwszą rzeczą jaką robimy jest ustawienie flagi na 1, a następnie pobranie danych z kategorie_wejscia (grupowanie po id_kategorii może się przydać), w których flaga wynosi 1. Dane przenosimy do kategorie_wejscia_liczba. Na koniec kasujemy rekordy, w których flaga = 1. Dzięki temu nie pominiemy żadnego wejścia (o ile jest to jeden z priorytetów). Jeśli wszystko jest napisane jak trzeba, to po chwili zobaczymy w tabeli z liczbą id kategorii odwiedzanych przez ludzi.

X popularnych kategorii

Wiemy już co jest najczęściej odwiedzane, ale szkoda mocy serwera na ciągle sortowanie danych. Dlatego też dodajemy kolejną tabelę kategorie_wejscia_top, do której przenosimy zadaną liczbę rekordów z kategorie_wejscia_liczba posortowanych malejąco liczbą wejść. Na stronie pokazujemy boks wypełniony danymi z zapytania:

select * from kategorie inner join kategorie_wejscia_liczba on id = id_kategorii

Wygaszanie wejść

Niekiedy kategorie wymagają indywidualnego podejścia. To, co było popularne rok temu nie musi być popularne obecnie. Dlatego też dobrze będzie zrobić mechanizm, który zapobiegnie utrzymywaniu się na wysokiej pozycji kategorii, które nie są już odwiedzane. Jednym ze sposobów może być całkowite wykasowanie danych z kategorie_wejscia_liczba i wyświetlenie kategorii, które w danym momencie były w kategorie_wejscia. Bardziej subtelnym sposobem będzie przeliczenie wszystkich rekordów jako liczba = liczba * 0.25. Dzięki temu kategorie popularne przy poprzednim przeliczeniu nie zdematerializują się, a tylko przesuną się dość mocno w dół. W ten sposób zabezpieczymy się także przed „pływaniem” treści na stronie, bo zawsze będzie odpowiednia liczba rekordów do pokazania.

Inne zastosowania

Osobne zliczanie wyświetleń przyda się także w często odwiedzanym forum dyskusyjnym. Niezależnie od tego ile jest postów i czy baza jest Innodb ruch może być na tyle duży, że zamiast pozwalać tysiącom ludzi modyfikować każdy rekord tematów lepiej będzie zastosować pośrednie tabele zliczające wyświetlenia.

Uwagi końcowe

Do przeliczania wejść najlepiej będzie zastosować mechanizm cyklicznych wywołań. Na serwerze linuksowym będzie to cron. Nie wszystkie firmy hostingowe dają dostęp, więc w razie problemów pozostanie jakiś zewnętrzny serwis, w którym podajemy częstotliwość wywołań i url do odpalenia przy każdym wywołaniu. Jeśli dobrze pamiętam, to Home daje możliwość odpalania zadań o ile umieścimy w głównym katalogu plik nazywający się cron-Xmin.php przykładowo: cron-5min.php. W takim pliku możemy wrzucić cały kod do wykonania, albo sprytnie umieścić curl odpalający odpowiedni adres url. Dzięki temu przy dużej ilości rzeczy do zautomatyzowania nie zrobimy z tego skryptu kilkumegowego potwora (nie testowałem tej opcji, więc mogę się mylić; jakby co, to proszę o komentarz potwierdzający, że cron z Home daje możliwość użycia curla).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*