2012-07-29 83 views
2

我有两个表,一个用于存储物品,并已收到的票数:我应该在什么情况下使用数据库触发器?

| article_id | visitor_votes | member_votes | voting_opened | 
------------------------------------------------------------- 
| 1   | 12   | 394   | Y    | 
| 3   | 94   | 5821   | Y    | 

我也有另外一个表,跟踪哪些用户投票支持该文章

| vote_id | user_id | article_id | date | 
-------------------------------------------- 
| 1  | 12  | 1   | 7/28/2012 
| 2  | 23  | 3   | 7/28/2012 

一用户每次交易只能投一票。我目前使用的触发器可以在每次将记录插入到投票表中时递增文章表中的投票数。这是一个好的做法,还是应该在我的应用程序(基于PHP网站的网站)中做这件事?我也想在一定数量的投票(voting_opened = N)后停止投票,我是否应该使用触发器来检查总票数(visitor_votes + member_votes> = 6000),然后更新文章行以设置voting_opened = N?或者这也是我在应用程序中应该做的事情?我需要一个可扩展的解决方案,因为我可能会为数百篇文章赢得数千票,而且我不想遇到票数超过阈值的情况,因为更新没有足够快地更新管他呢。请问有人可以在这种情况下点亮一下吗?

谢谢!

+0

我不会保留总票数,只需根据需要从user_vote表中添加它们即可。 – 2012-07-29 02:07:58

+0

该解决方案的问题是投票表目前拥有超过1亿条记录。在每个用户进行投票之前对它们进行总结,从性能角度来看非常沉重。作为一个简单的选择和比较相对较低。 – user1143767 2012-07-29 02:22:55

回答

1

这两种解决方案都是有效的,并且应该同样适用。

你可以尝试这样的事情在应用

UPDATE articles SET 
    visitor_votes = visitor_votes + 1 
    voting_opened = IF(visitor_votes + member_votes >= 6000, 'N', 'Y') 
WHERE 
article_id = xxxx 
AND voting_opened = 'Y' 

然后检查受影响的行,如果它是> 0票表中插入的行。

相关问题