Come gestire la valutazione? [chiuso]

2

Voglio implementare il sistema come / non mi piace, ma non so come ottenere le migliori prestazioni. Devo alle tabelle: post di blog e commenti che hanno bisogno di valutazione.

  • Devo memorizzare tutti i dati in una tabella di valutazione? O dovrei creare tabelle separate per i post e per i commenti?
  • Devo archiviare il risultato totale in un record nella tabella dei post o dovrei eseguire una query per tutti i clic +1 in tali tabelle di valutazione? Voglio che una persona valuti un commento / post una sola volta.
  • Devo contrassegnare se la persona ha già votato per un commento o un post o si limita a danneggiare le prestazioni?

Non ho lanciato grandi sistemi, ma guardando gli stessi progetti penso che ci saranno 15000 hit al giorno, ma in esecuzione su VPS medio con 1-2 GB di RAM, 1-2 core e senza SSD. Potrebbe essere aggiornato rapidamente a un server dedicato molto più potente ma è troppo costoso.

    
posta Dracontis 05.06.2015 - 09:26
fonte

1 risposta

5

Devi sapere se un dato utente ha votato su un determinato post e su ogni commento dato. Ciò significa che devi introdurre una nuova tabella user_post_votes con una colonna user_id e una colonna post_id , oltre a una tabella user_comment_votes con una colonna user_id e una colonna comment_id .

Se è possibile solo l'upvoting, la presenza di una riga in ognuna di queste tabelle significa che l'utente con il dato user_id ha messo in svantaggio il post o il commento con l'id specificato. Tuttavia, se è possibile effettuare l'upvoting o la downvote, sarà necessaria un'altra colonna per "upvote" o "downvote". Il miglior tipo per quella colonna è in realtà INTEGER , con valori validi pari a -1 o +1, in modo che SELECT SUM(vote) FROM user_post_votes WHERE post_id = X ti fornisca i voti totali per un post, tenendo conto dei downvotes. (potrebbe anche fare TINYINT , ma non sono sicuro che se verrà sommato correttamente in un intero se ci sono più di 128 upvotes, sarà necessario verificarlo.)

Should I store all data in one rating table? Or should I create separate tables for posts and for comments?

Presumo che in effetti tu abbia già tabelle separate per i post e per i commenti e che cosa intendessi effettivamente chiedere con la domanda precedente era se dovresti anche creare tabelle separate per voti sui post e per voti sui commenti. Si, dovresti. E se provassi a fare qualcos'altro, scopriresti molto presto che nient'altro ha senso. I post devono essere identificati da una colonna post_id in una tabella user_post_votes e i commenti devono essere identificati da una colonna comment_id in una tabella user_comment_votes . Non c'è modo di aggirare questo. Non è possibile avere una colonna che contiene un ID che in alcuni casi si riferisce a una tabella e in alcuni casi fa riferimento a un'altra tabella. (Tecnicamente si potrebbe, ma una cosa del genere sarebbe in palese violazione della teoria dei database relazionali, contro tutte le migliori pratiche e praticamente un incubo con cui lavorare.)

Should I store total result into one record in post table or should I query for all +1 click in that rating tables? I want one person to rate on comment/post just one time.

non memorizza il risultato totale ovunque . Per prima cosa, completa lo sviluppo del tuo sistema e portalo a uno stato pienamente funzionante, ricalcando il conteggio dei voti ogni volta che è necessario, come ho già mostrato. Quindi, se e solo se sembra esserci un problema di prestazioni, e se e solo se puoi dimostrare che il problema di prestazioni si trova in questo calcolo, allora ottimizza quella parte memorizzando nella cache il conteggio totale dei voti per ogni post. La maggior parte delle possibilità sono, non sarà necessario.

Should I mark if person already voted for comment or post or is it just damage performance?

Non puoi semplicemente "segnare" se una persona ha già votato, perché hai N persone, X commenti e Y post. Questa è una relazione molti-a-molti, quindi come ho già spiegato, devi avere una tabella user_comment_votes e una tabella user_post_votes . Se fa male o meno prestazioni è irrilevante, dal momento che hai già stabilito che questa informazione è necessaria. Quindi, se è necessario, dovrai tenerne traccia.

    
risposta data 05.06.2015 - 13:40
fonte

Leggi altre domande sui tag