【发布时间】:2010-09-04 12:40:33
【问题描述】:
就获得以下结果的最佳方法发表了一些意见:
我想在我的 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 表进行 COUNT。
例如,当我想查找香蕉和要在网页上显示的投票数时,我可以执行以下查询:
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 可以每秒处理数千个查询而性能下降到很多