Best practice per la struttura del database di votazione dei commenti
Domanda
Sto lavorando ad un'app PHP che ha diversi oggetti su cui è possibile commentare. Ogni commento può essere votato, con gli utenti in grado di dare +1 o -1 (come Digg o Reddit). In questo momento sto programmando di avere una tabella di "voti" che contenga user_id e le loro informazioni di voto, che sembra funzionare bene.
Il fatto è che ogni oggetto ha centinaia di commenti che sono memorizzati in una tabella di commenti separata. Dopo aver caricato i commenti, devo calcolare i voti e quindi controllare individualmente ogni voto contro l'utente per assicurarmi che possano votare una sola volta. Funziona ma sembra davvero intensivo per il database - molte domande solo per i commenti.
Esiste un metodo più semplice per farlo che richiede meno DB? La mia attuale struttura di database è il modo migliore per andare?
Per essere più chiari sull'attuale struttura del database:
Tabella dei commenti:
- user_id
- object_id
- total_votes
Tabella dei voti:
- COMMENT_ID
- user_id
- voto
Fine obiettivo:
- Consenti all'utente di votare una sola volta su ciascun commento con almeno # query MySQL (ogni oggetto ha più commenti)
Soluzione
Per assicurarti che ogni elettore voti una sola volta, progetta la tua tabella dei voti con questi campi & # 8212; CommentID, UserID, VoteValue. Imposta CommentID e UserID come chiave primaria, che assicurerà che un utente ottenga un solo voto. Quindi, per richiedere i voti per un commento, fai qualcosa del genere:
SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?
Aiuta?
Altri suggerimenti
Perché non salvi i voti totali per ogni commento? Aumenta / diminuisci questo quando si è verificato un nuovo voto.
Quindi devi verificare se l'utente ha votato specificamente per questo commento per consentire un solo voto per commento per utente.
È possibile inserire una condizione di join sql che restituisce tutti i voti sui commenti fatti dall'utente corrente per questo oggetto, se non si ottengono righe, l'utente non ha votato. Questo è leggermente diverso dal fatto che tu controlli ogni commento uno alla volta nel programma.
per quanto riguarda la struttura del database, mantenere separate queste cose sembra perfettamente logico. voto {user_id, object_id, object_type, vote_info ...)
Forse lo stai già facendo, scusa ma non potrei interpretare dal tuo post se fosse così.