Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Baza głosów publicznego systemu moderacji (czyli plusy i minusy)
Forum PHP.pl > Forum > Bazy danych > MySQL
paw-e-l
Witam
Chcę wprowadzić na swojej stronie możliwość dawania + lub - zamieszczonym komentarzom (jak na wykopie). Oczywiście dany użytkownik może głosować tylko raz na dany komentarz.
Mam 2 koncepcje jak powinna wyglądać tabela z głosami i nie wiem która będzie lepsza.

  1. tabela `comment_ratings` będzie zawierać 3 pola:
    • `comment_id` - mówi samo za siebie
    • `rating` - suma oddanych + i -
    • `used_ids` - id użytkowników którzy oddali głosy na dany komentarz w postaci ",21,32,87,3,..."

    w tej tabeli jest tylko jeden rekord dla każdego komentarza

  2. tabela `comment_ratings` będzie zawierać 2 pola:
    • `comment_id` - j.w.
    • `user_id` - id użytkownika który oddał głos na dany komentarz

    w tej tabeli ilość rekordów była by znacznie większa bo każdy głos to osobny rekord


Przy każdym załadowaniu podstrony z komentarzami trzeba sprawdzić czy na poszczególne komentarze użytkownik który jest zalogowany oddał głos
  1. w tym przypadku trzeba dla każdego obecnego na podstronie komentarz wykonać:
    1. // $user_id - zmienna zawierająca id zalogowanego użytkownika
    2. //$comment_id - id komentarza
    3. SELECT COUNT(*) FROM `comment_ratings` WHERE `comment_id`=$comment_id AND `user_ids` LIKE ",%$user_id%,"
  2. tutaj sprawa jest prostsza:
    1. SELECT COUNT(*) FROM `comment_ratings` WHERE `comment_id`=$comment_id AND `user_id`=$user_id


które rozwiązanie jest optymalniejsze i nie będzie zarzynać bazy biggrin.gif ?
Cezar708
drugie, tylko nie zapomnij o indeksie na kolumnę user_id, oraz o rodzaju głosu który został oddany (+ lub -)

pozdrawiam
paw-e-l
dziękuję za błyskawiczną odpowiedź smile.gif

ach tak rodzaj oddanego głosu... nie wspomniałem że w drugim rozwiązaniu suma + i - będzie przechowywana w tabeli `comments` aby nie podliczać głosów za każdym razem przy wyświetlaniu winksmiley.jpg wtedy nie muszę w tabeli `comment_ratings` przechowywać rodzaju oddanego głosu.

btw. tak z ciekawości, dlaczego indeks na `user_id` a nie `comment_id`?

pozdrawiam
Cezar708
Cytat(paw-e-l @ 6.09.2009, 11:21:22 ) *
nie wspomniałem że w drugim rozwiązaniu suma + i - będzie przechowywana w tabeli `comments` aby nie podliczać głosów za każdym razem przy wyświetlaniu winksmiley.jpg wtedy nie muszę w tabeli `comment_ratings` przechowywać rodzaju oddanego głosu.


liczba głosów w comments jeszcze może być, ale w taki sposób nie będziesz wiedział kto jaki głos oddał, oczywiście jeśli nie jest Ci to potrzebne, to Twój sposób starczy, ale z doświadczenia wiem, że czasem taka informacja może być bardzo przydatna, więc na Twoim miejscu przy tam małym narzucie (w sumie to tylko jedna kolumna typu bool), dodałbym ją do tabeli comment_ratings

Pozdrawiam
paw-e-l
w sumie racja. można by dzięki temu dodatkowo prowadzić statystyki per user ile w sumie oddał + / - winksmiley.jpg

mógłbyś jeszcze zerknąć do mojego poprzedniego posta? edytowałem go i jest tam jeszcze 1 pytanie.
Cezar708
Cytat(paw-e-l @ 6.09.2009, 11:21:22 ) *
btw. tak z ciekawości, dlaczego indeks na `user_id` a nie `comment_id`?



fakt, na comment_id tez jest indeks potrzebny, czyli dwa indeksy musisz mieć aby nie zarżnąć bazy.

pozdro
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.