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.