2009-05-01 15 views
6

Pracuję nad aplikacją PHP, która ma kilka obiektów, które można komentować. Każdy komentarz można poddać głosowaniu, przy czym użytkownicy mogą nadać mu +1 lub -1 (np. Digg lub Reddit). W tej chwili planuję mieć tabelę "głosów", która nosi identyfikator użytkownika i informacje o głosowaniu, co wydaje się działać dobrze.Najlepsza praktyka dla struktury bazy danych z głosowaniem głosowym

Chodzi o to, że każdy obiekt ma setki komentarzy, które są przechowywane w osobnej tabeli komentarzy. Po wczytaniu komentarzy muszę potwierdzić głosy, a następnie indywidualnie sprawdzić każdy głos przeciwko użytkownikowi, aby upewnić się, że mogą głosować tylko raz. Działa to, ale wydaje się, że naprawdę wymaga dużej ilości danych - wiele zapytań tylko o komentarze.

Czy istnieje prostsza metoda wykonania tej czynności, która wymaga mniej intensywnej bazy danych? Czy moja obecna struktura bazy danych jest najlepszym sposobem na przejście?

Aby być jaśniejsze o bieżącej struktury bazy danych:

Komentarze tabela:

  • user_id
  • object_id
  • total_votes

Głosy tabela:

  • comment_id
  • user_id
  • głosowanie

Koniec Cel:

  • Pozwól użytkownikowi głosować tylko raz na każdy komentarz z co najmniej # zapytań MySQL (każdy obiekt ma wiele komentarzy)

Odpowiedz

8

Aby upewnić się, że każdy głosujący zagłosuje tylko raz, zaprojektuj swoją tabelę głosów z tymi polami: — Identyfikator komentarza, identyfikator użytkownika, ocena głosowa. Wprowadź CommentID i UserID jako klucz podstawowy, dzięki którym jeden użytkownik uzyska tylko jeden głos. Następnie, aby zapytać o głosy za komentarzem, zrób coś takiego:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

Czy to pomaga?

+0

To bardzo pomaga, dzięki! Ta myśl o posiadaniu dwóch podstawowych kluczy nawet nie przyszła mi do głowy ... – mdolon

0

Dlaczego nie zapisać łącznej liczby głosów na każdy komentarz? Przywołaj/zmniejsz to w momencie, gdy miało miejsce nowe głosowanie.

Następnie należy sprawdzić, czy użytkownik głosował specjalnie na ten komentarz, aby pozwolić tylko jeden głos na komentarz dla każdego użytkownika.

+0

Sztuczka to druga część, sprawdzająca, czy użytkownik zagłosował na ten konkretny komentarz - w zasadzie prowadzi to do posiadania oddzielnej tabeli głosowania. – mdolon

0

Możesz umieścić warunek łączenia sql, który zwraca wszystkie głosy na komentarze zgłoszone przez bieżącego użytkownika dla tego obiektu, jeśli nie masz wierszy, użytkownik nie głosował. To trochę różni się od sprawdzania każdego komentarza po kolei w programie.

jeśli chodzi o strukturę bazy danych, zachowanie tych elementów osobno wydaje się całkowicie logiczne. głosuj {user_id, object_id, object_type, vote_info ...)

Być może już to robisz, przepraszam, ale nie mogłem zinterpretować z twojego wpisu, jeśli tak było.

Powiązane problemy