0

我正在制作一个系统,用户可以在产品上进行投票或者停止投票,我需要能够明确计算出产品的涨跌幅度,以及作为最近一段时间的总分。产品投票系统的数据库设计

每个投票都可以有选择地对它发表评论,用户需要能够回显/提升其他人的评论(有点像转推),并且这也会根据父母添加/减去产品的总分投票被转推。

这里是我目前的建议表:

产品
ID,姓名,CATEGORY_ID

投票
ID,USER_ID,PRODUCT_ID,PARENT_ID,评论,评分,日期时间

用户
ID,usernam e等

我想我可能需要一个评论表来有效地做到这一点?根据我在StackOverflow上读到的一些建议,投票的得分字段为1或-1,这将允许我收集该列的SUM()以计算总投票数,另一种可能性是具有单独的vote_up和vote_down表......但我只是不确定。

回答

6

这取决于你想做什么,这可能是一个非常复杂的问题,但这是我最简单的方法(例如,我可以在离开工作前10分钟把它扔在一起; -P)

我会尝试StackOverflow/HotOrNot风格的方法,并将它们的排名存储为无符号整数。

PRODUCTS(
id, 
category_id, 
name, 
rating INTEGER UNSIGNED NOT NULL DEFAULT 0 
); 

然后在您的'VOTES'表中,您存储投票(上/下)。我认为你的'VOTES'表的表格看起来很好(尽管我会使用枚举作为SCORE数据类型,或者一些策略来确保投票不能通过XSS进行操作,例如,某人修改了投票表决权他们的投票是+10,000而不是+1,那么这不会很酷)

对于一个小的有趣的应用程序,你可以通过增加或减少计数,当用户点击,但如果你正在做任何有扩展愿望的东西,那么你将通过一些每10-15分钟运行一次的批处理进行投票计算和排序。

同样在这个级别,您将开始使用算法来对投票值进行加权。例如,如果同一用户每天不止一次(或每次)投票(向上或向下)同一产品,则第一次之后的投票不应计入计算产品的排名。

For Example, here is how Quora's Ranking Algorithm works

如果用户是一个“超级用户”或有较为活跃,也许他们的票是不是一个新的用户投票更重要的帐户。我想在Yelp上,如果你没有超过一两个评论,你的评分和评论不会被计算出来,直到你满足最少的评论数量。真的,天空的极限。

PS. I would also recommend checking out this o'Reilly book on some of the strategies for solving these kinds of problems

1

Beginning CakePHP对上意见落实工作表决(上/下)系统中的Ajax教程。几年前我做过这个教程。我不确定它有多安全,或者它是否会成为您项目的良好基础,但可能值得查看一些想法。

1

如果您预计会有大量的用户同时投票,你真的需要考虑性能....

天真的方法可能是这个样子(我的道歉,如果我过于简化你的榜样,如果T- SQL是不是你的毒药):

create table Products(
ProductId BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
Score  INT NOT NULL... 
ProductDetails... 

在那里你会通过总结向上/向下表决表来进行产品的更新。坏!

如果你有大量的用户投票,肯定会发生死锁,通过不断插入/更新/选择对同一张表。

更好的方法是完全放弃Score列,只插入向上/向下投票表,并根据需要进行选择。没有理由不能计算代码中的总和(即PHP,C#或其他),并且它避免了必须更新Products表(至少用于计算Score)。换句话说,将产品分数存储在产品表上并不会为您购买任何产品,而只是不必要的开销。

我说的经验,当我说更新“可以”在高容量系统中不好。与在末尾插入或选择相比,更新是昂贵的(假设您的表格已正确编制索引),并且很容易在不知情的情况下在这种情况下取​​出大量锁定。