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       |
| .. | ..          |    | .. | ..          |    | .. | ..         | ..      |

Таким образом, я могу сделать СЧЕТ таблицы 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

Если бы мой сайт стал чрезвычайно успешным (мы все можем мечтать), и у меня было тысячи пользователей, голосующих за тысячи продуктов, я боюсь, что выполнение такого СЧЕТА при каждом просмотре страницы было бы крайне неэффективным с точки зрения ресурсов сервера.

Более простой подход состоял бы в том, чтобы в таблице продуктов имелся столбец «голоса», увеличивается каждый раз, когда добавляется голос.

  table: product               
+----+-------------+-------+
| id |   product   | votes |
+----+-------------+-------+
| 1  | bananas     | 2     |
| 2  | apples      | 5     |
| .. | ..          | ..    |

Хотя это более благоприятно для ресурсов - я теряю данные (например, я больше не могу препятствовать тому, чтобы человек голосовал дважды, поскольку нет записи об его активности голосования).

Мой вопросы:
я) я чрезмерно беспокоюсь о ресурсах сервера и должен просто придерживаться трех таблиц вариант? (т.е. мне нужно больше верить в способность базы данных обрабатывать большие запросы)
ii) это более эффективный способ достижения результата без потери информации

6
задан So Over It 4 September 2010 в 12:40
поделиться