Только после того, как некоторые мнения по лучшим способом для достижения следующих результатов:MySQL - как оптимизировать запрос для подсчета голосов
Я хотел бы хранить в своих продуктах баз данных MySQL, которые могут быть голосовавших на пользователей (каждый голос стоит +1). Я также хочу видеть, сколько раз всего голосовал пользователь.
К моему простому виду, следующая структура таблицы будет идеальным:
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 |
| .. | .. | | .. | .. | | .. | .. | .. |
Таким образом, я могу сделать COUNT таблицы user_product_vote для каждого продукта или пользователя.
Например, когда я хочу посмотреть бананы и количество голосов, чтобы показать на веб-странице я мог бы выполнить следующий запрос:
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
Если мой сайт стал чрезвычайно успешным (мы можем все мечты), и у меня было тысячи пользователей, голосовавших по тысячам продуктов, я опасаюсь, что выполнение такого COUNT с каждым просмотром страницы будет крайне неэффективным с точки зрения ресурсов сервера.
Более простым подходом было бы иметь столбец «голосов» в таблице продуктов, который увеличивается каждый раз при добавлении голоса.
table: product
+----+-------------+-------+
| id | product | votes |
+----+-------------+-------+
| 1 | bananas | 2 |
| 2 | apples | 5 |
| .. | .. | .. |
Хотя это более рациональное использование ресурсов - я теряю данные (например, я больше не могу помешать человеку дважды голосовать, поскольку нет никаких сведений об их деятельности для голосования.).
Мои вопросы:
i) Я слишком беспокоюсь о ресурсах сервера и должен просто придерживаться трехфазной опции? (т. е. мне нужно больше верить в способность базы данных обрабатывать большие запросы)
ii) является их более эффективным способом достижения результата без потери информации
еще одна проблема, с которой у вас есть, вероятно, у вас никогда не было веб-сайта, который получает массовый трафик, поэтому вы не уверены в возможностях php/mysql. Я заверяю вас, что mysql может обрабатывать тысячи запросов в секунду с понижающейся производительностью – RobertPitt