Subito dopo alcune opinioni sul modo migliore per raggiungere il seguente esito:MySQL - come ottimizzare query per contare i voti
Vorrei conservare nei miei prodotti di database MySQL che possono essere votate dagli utenti (ogni voto vale +1). Voglio anche essere in grado di vedere quante volte in totale un utente ha votato.
Per la mia mente semplice, la seguente struttura della tabella sarebbe l'ideale:
table: product table: user table: user_product_vote
+----+-------------+ +----+-------------+ +----+------------+---------+
| id | product | | id | username | | id | product_id | user_id |
+----+-------------+ +----+-------------+ +----+------------+---------+
| 1 | bananas | | 1 | matthew | | 1 | 1 | 2 |
| 2 | apples | | 2 | mark | | 2 | 2 | 2 |
| .. | .. | | .. | .. | | .. | .. | .. |
In questo modo posso fare un conteggio del tavolo user_product_vote per ogni prodotto o utente.
Per esempio, quando ho voglia di guardare su banane e il numero di voti di mostrare su una pagina web ho potuto eseguire la seguente query:
SELECT p.product AS product, COUNT(v.id) as votes
FROM product p
LEFT JOIN user_product_vote v ON p.id = v.product_id
WHERE p.id =1
Se il mio sito è diventato un enorme successo (tutti noi possiamo sogno) e avevo migliaia di utenti che votavano su migliaia di prodotti, temo che l'esecuzione di un tale COUNT con ogni visualizzazione di pagina sarebbe altamente inefficiente in termini di risorse del server.
Un approccio più semplice consiste nell'avere una colonna 'voti' nella tabella prodotto che viene incrementata ogni volta che viene aggiunta una votazione.
table: product
+----+-------------+-------+
| id | product | votes |
+----+-------------+-------+
| 1 | bananas | 2 |
| 2 | apples | 5 |
| .. | .. | .. |
Mentre questo è più risorsa gentile - ho una perdita di dati (ad esempio, non riesco più a impedire ad una persona di votare due volte in quanto non v'è alcuna traccia della loro attività di voto.).
Le mie domande sono:
i) sono eccessivamente preoccupato per le risorse del server e dovrei limitarmi all'opzione con tre tabelle? (Es. Devo avere più fiducia nella capacità del database per gestire le query di grandi dimensioni)
ii) è il loro un modo più efficiente di ottenere il risultato senza perdere le informazioni
un altro problema è che probabilmente non hai mai posseduto un sito web che ottiene traffico di massa, quindi la tua insicurezza delle funzionalità php/mysql, ti assicuro che mysql può gestire migliaia di query al secondo con prestazioni drastiche a molto – RobertPitt