如何在我的数据库设计中实施星级评级系统?

时间:2016-03-24 17:16:44

标签: mysql database erd rating-system

我目前正在开发一款Android应用,我想让用户对其他用户发布的帖子进行评分。

ERD model of Database

这是我目前的设计,但是,我会将评分作为单独的表格包含在内还是包含在媒体上传表格中?

如果它是一个单独的表,它会是这样的吗?

评级表:(评级,PostID,Rating_Count,Average_Rating)

如果我的设计出现任何其他问题,我们也将不胜感激!

3 个答案:

答案 0 :(得分:2)

这一切都取决于你希望评级如何运作,谁进行投票或投票,是否跟踪所有投票以避免同一人投票的人等等。

这就是我要做的:为每个投票添加一个唯一的数字(长?)RatingID字段,将PostID字段链接到评论表,添加Rating(整数) )字段限制为0到5(或您喜欢的任何范围)的值,然后计算所有投票的平均值(删除Rating_CountAverage_Rating字段)。您可以定义视图来计算每个帖子的平均评分,以用于您的例程,以确定如何在帖子旁边显示它。

另外,我会为每个用户使用ID,而不是使用他们的名字。

所以我的表格看起来像这样:

RatingID, PostID, UserID, Rating

此外,为了防止用户多次投票,该表格不允许同一PostIDUserID的多个条目。

答案 1 :(得分:1)

这取决于您希望如何存储评级。

如果您想跟踪每个评分。您将需要一个评级表,其中包含以下内容:

Column
---------
RatingID (PK)
Username (FK) (UserDetailsID if you change the primary key of the UserDetails table)
PostID (FK)    
RatingScore
DateRated

在应用中,您可以使用RankScore撤回每个PostID,并根据所述PostID的计数进行计算。

我会推荐上述方法,因为它可以让你在将来使用评级做更多的事情。另外,您可以使用Comments表格建立良好的结构。恩。显示谁评分什么和得分。

如果要将其附加到Post表,则不需要另一个表。您只需将Rating_CountAverage_Rating添加到表格中即可。在您的应用中,您不必每次评价帖子时都要执行更新。您必须提取Rating_CountAverage_Rating,将Rating_Count递增1,重新计算Average_Rating并执行更新。

如果您想提高评分设置,我的第二个建议就不那么​​灵活了。

答案 2 :(得分:0)

您可以像这样使用担架

enter code here
        $table->bigIncrements('id');
        $table->bigInteger('user_id')->unsigned();
        $table->ipAddress('ip')->nullable();
        $table->integer('star');
        $table->string('type');           
        $table->string('title');
        $table->string('average')->nullable()->default(0);
        $table->integer('count_star')->default(0)->nullable();
        $table->float('star_avg')->default(0)->nullable();
        $table->float('unstar_avg')->default(0)->nullable();