【发布时间】:2014-06-26 02:10:51
【问题描述】:
我有 2 张桌子 posts<id, user_id, text, votes_counter, created> 和 votes<id, post_id, user_id, vote>。这里的表格投票可以是 1(赞成)或 -1(反对)。现在,如果我需要获取帖子的总票数(赞成票 - 反对票),我可以通过 2 种方式完成。
- 使用
count(*)计算votes表中对该帖子的赞成和反对的数量,然后进行数学运算。 - 设置一个计数器列
votes_counter,并在每次用户赞成或反对时增加或减少它。然后简单地提取votes_counter。
我的问题是哪个更好,在什么条件下。我所说的条件是指可扩展性、峰值时间等因素。
据我所知,如果我使用方法 1,对于具有数百万行的表,count(*) 可能是一个繁重的操作。为了避免这种情况,如果我在高峰时间使用计数器,则 votes_counter 列可能会死锁,太多用户试图更新计数器!
是否有第三种方式比这两种方式更好且实施起来更简单?
【问题讨论】:
-
"votes_counter 列可能会死锁,太多用户试图更新计数器" --- 为什么这里应该是死锁?
-
@zerkms 我的意思是技术上没有僵局!假设有 1000 名用户试图每秒对一篇帖子进行投票。但是数据库服务器无法在一秒钟内处理 1000 次操作。这就是我所说的那种情况。
-
当您有 1000 个用户同时在您的网站上执行某项操作时 - 增加单个计数器将不是您需要担心的事情。
-
@zerkms 好吧,这是我的大学模拟项目。真正的每秒 1K 用户是一件大事!