Justo después de algunas opiniones sobre la mejor manera de lograr los siguientes resultados:MySQL - cómo optimizar la consulta a contar los votos
me gustaría guardar en mis productos de base de datos MySQL, que puede ser votada por los usuarios (cada voto vale +1). También quiero poder ver cuántas veces en total un usuario ha votado.
A mi modo sencillo, la siguiente estructura de la tabla sería ideal:
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 |
| .. | .. | | .. | .. | | .. | .. | .. |
De esta manera me puede hacer un conteo de la mesa user_product_vote para cada producto o usuario.
Por ejemplo, cuando quiero mirar hacia arriba plátanos y el número de votos a mostrar en una página web que pude realizar la siguiente consulta:
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
Si mi sitio se convirtió en un enorme éxito (todos podemos sueño) y tenía miles de usuarios votando sobre miles de productos, me temo que realizar tal COUNT con cada vista de página sería altamente ineficiente en términos de recursos del servidor.
Un enfoque más simple sería tener una columna de 'votos' en la tabla de productos que se incrementa cada vez que se agrega un voto.
table: product
+----+-------------+-------+
| id | product | votes |
+----+-------------+-------+
| 1 | bananas | 2 |
| 2 | apples | 5 |
| .. | .. | .. |
Si bien esto es más respetuosa de los recursos - que se pierdan datos (por ejemplo, ya no puedo evitar que una persona pueda votar dos veces ya que no hay ningún registro de su actividad votación.).
Mis preguntas son:
i) ¿Estoy demasiado preocupado por los recursos del servidor y debería seguir con la opción de tres tablas? (es decir, necesito tener más fe en la capacidad de la base de datos para manejar consultas grandes)
ii) es su forma más eficiente de lograr el resultado sin perder información
otro problema que tiene es probablemente nunca ha tenido un sitio web que recibe tráfico masivo, por lo que no está seguro de las capacidades de php/mysql, le aseguro que mysql puede manejar miles de consultas por segundo con caída de rendimiento a mucho – RobertPitt