我想请教一下如何实现以下目标:
我希望将可以由用户投票的产品存储在我的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
如果我的网站获得了巨大的成功(我们都可以梦想),并且有成千上万的用户在数以千计的产品上进行投票,我担心每个页面视图都执行这样的COUNT操作会在服务器资源方面非常低效。
更简单的方法是在产品表中设置一个“投票”列,并在添加投票时递增该列。
table: product
+----+-------------+-------+
| id | product | votes |
+----+-------------+-------+
| 1 | bananas | 2 |
| 2 | apples | 5 |
| .. | .. | .. |
虽然这样更加节省资源,但我会失去数据(例如,我不能再防止一个人投票两次,因为没有他们投票活动的记录)。
我的问题是:
i)我是否过于担心服务器资源,应该坚持使用三个表的选项?(即,我是否需要更信任数据库处理大型查询的能力)
ii)是否有更有效的方法来实现结果而不丢失信息