在听取了关于实现以下结果的最佳方法的一些意见之后:
我想在我的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)是一种更有效的方法来实现结果而不会丢失信息
您永远不会过度担心资源,当您第一次开始构建应用程序时,您应始终考虑资源,空间,速度等,如果您的网站流量急剧增长而您从未构建过资源,那么您就会开始遇到问题.
至于投票制度,我个人会像这样保留投票:
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
不包含文本,blob等,它纯粹是整数,所以它总是占用更少的资源.
其次,您可以在应用程序中找到更多通向新实体的门户,例如过去24小时的总投票数,过去24小时内的最高评分产品等.
以这个例子为例:
table: user_product_vote +----+------------+---------+-----------+------+ | id | product_id | user_id | vote_type | time | +----+------------+---------+-----------+------+ | 1 | 1 | 2 | product |224.. | | 2 | 2 | 2 | page |218.. | | .. | .. | .. | .. | .. |
一个简单的查询:
SELECT COUNT(id) as total FROM user_product_vote WHERE vote_type = 'product' AND time BETWEEN(....) ORDER BY time DESC LIMIT 20
另一件事是,如果用户投票1AM
然后再次尝试投票2PM
,您可以轻松检查他们上次投票的时间以及是否应该允许他们再次投票.
如果您坚持使用增量示例,那么您将失去很多机会.
关于你count()
,无论你如何优化你的查询,它都不会在很大程度上产生影响.
使用极大的用户群,您可以从不同的角度查看资源使用情况,例如负载均衡器,主要是服务器设置,Apache,捕获等等,您只能对查询执行此操作.