0

我对从头开始创建这样的功能来学习很感兴趣,我很难理解并能够规划这样的结构。我所见过的大多数程序员都会检查是否有人已经通过他们的 IP 地址对评论或帖子进行了评分,我特别不喜欢这样,因为每个用户都必须登录才能投票,所以为什么不检查用户 ID 而不是知识产权。我也倾向于选择性能而不是外观,所以有人可以帮助我了解如何开始实现这一目标。我已经阅读并搜索了许多关于 SO(StackOverflow) 的帖子,但它们对我来说并不太全面。我还在某处读到有一个 UNIQUE KEY 约束只允许一票,对吗?

关于表结构以及如何设计的一些建议将不胜感激。

我对这种结构感到困惑,下表是我到目前为止所得到的。

Posts:
post_iD | message | uid_fk(user id) | voteUp | voteDown

PostsRateSystem:
rate_iD | rate_user_iD(uid_fk from posts table) | 

我什至需要第二张表来跟踪谁进行了评分。

if(isset($_POST['plus']) && isset($_POST['minus'])){
    $plus = $_POST['plus'];
    $minus = $_POST['minus'];
    $row = insertRate($post_iD, $plus, $minus);
}

<form method="post" action="">
    <a href="javascript:;" name="plus" id="<?php echo $row['post_iD'];?>">Thumbs Up</a>  
    <a href="javascript:;" name="minus" id="<?php echo $row['post_iD'];?>">Thumbs Down</a>

function insertRate($post_iD, $plus, $minus)
{
    if($plus)
    {
        $sth = $this->db->prepare("UPDATE posts SET voteUp = 1 WHERE post_iD = :postiD");
        $sth->execute(array('postiD' => $post_iD));
    }
    if($minus)
    {
        $sth = $this->db->prepare("UPDATE posts SET voteDown = 1 WHERE post_iD = :postiD");
        $sth->execute(array('postiD' => $post_iD));
    }
}
4

1 回答 1

1

如果所有用户都可以对每个帖子进行一次评分,则您必须拥有第三个表 ( votes),其中包含用户 ID、帖子 ID 和评分值(1 或 -1)。在该表中,您应该使 userid 和 postid 的组合唯一,因为每个帖子只允许用户投一票。

要获得帖子的总票数,您可以将这些值相加:

SELECT SUM(votes.value) FROM votes WHERE postid = 10

现在,每个赞成票都计为一,每个反对票都计为减一,因为这些是存储的实际值。

要保存投票,您必须先尝试更新表格,因为登录的用户已经可以投票。如果更新失败,可能是由于不存在投票,您可以为该帖子的用户插入投票。

为了加快速度,您还可以增加或减少 post 表本身中的投票计数器。那个不跟踪所有用户,但它确实跟踪总分。这样,您不必查询sum投票的每个页面视图。但请记住,如果使用将他们的赞成票更改为反对票,则您必须从该分数中减去 2,反之亦然。或者,您可以SELECT SUM在每次更改帖子的投票后使用查询来计算投票并将其存储在帖子中。因此,在为第 10 条投票后,请执行以下操作:

UPDATE posts
SET score = (SELECT SUM(value) FROM votes WHERE postid = 10)
WHERE postid = 10
于 2013-07-02T05:34:59.577 回答