产品投票系统的数据库设计

时间:2011-02-23 22:59:13

标签: database database-design cakephp relational-database database-schema

我正在建立一个系统,用户可以在产品上投票或投票,我需要能够明确计算出产品的起伏数量,以及最近的总分数。周期。

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

以下是我目前提出的表格:

产品
ID,name,category_id

投票
ID,user_id,product_id,parent_id,comment,score,datetime

用户
ID,用户名等。

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

如果您希望大量用户同时投票,您确实需要考虑性能....

天真的方法可能看起来像这样(如果我过度简化你的例子,如果T-SQL不是你的毒药,我很抱歉):

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

您将通过汇总/减少投票表来执行产品更新。 BAD!

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

更好的方法是完全删除分数列,只插入上/下投票表,然后根据需要选择。没有理由你无法计算代码中的总和(即PHP,C#或其他),并且它避免了必须更新Products表(至少用于计算分数)。换句话说,将Score存储在Products表上只会给你带来任何好处,而且只是不必要的开销。

当我说高容量系统中的更新“可能”不好时,我会从经验中说话。与在最后插入或选择(假设你的表被正确编入索引)相比,更新是昂贵的,并且在这种情况下很容易在不知不觉中取出实质性锁定。

答案 2 :(得分:1)

Book Beginning CakePHP有一个关于在评论上实现有效投票(上/下)系统的Ajax教程。几年前我做了教程。我不确定它是多么安全,或者它是否是您项目的良好基础,但是可能值得看一些想法。

相关问题