我对从头开始创建这样的功能学习很感兴趣,我很难理解并能够规划这样的结构。据我所见,大多数程序员都会检查是否有人已经根据他们的iP地址对评论或帖子进行了评分,我特别不喜欢这样做,因为每个用户都必须登录才能投票,所以为什么不检查用户的iD而不是IP。我也倾向于选择性能而不是外观,所以有人能帮我理解如何开始实现这一点吗?我已经在SO(StackOverflow)上阅读和搜索了许多帖子,但它们对我来说并不是太全面。我还在某处读到有一个唯一的键约束,只允许一次投票,对吗?
对于表格结构以及如何设计的建议,我们将不胜感激。
我对这样的结构感到困惑,下面的表格是我到目前为止所得到的。
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));
}
}发布于 2013-07-02 13:35:00
如果所有用户都可以对每个帖子进行一次评分,则必须有第三个表(votes),该表具有userid、postid和评分值(1或-1)。在该表中,您应该使userid和postid的组合是惟一的,因为每个帖子只允许一个用户投票。
要获得帖子的总票数,您可以将这些值相加:
SELECT SUM(votes.value) FROM votes WHERE postid = 10现在,每一次向上投票都被算作1,而每一次下投票都被算作负1,因为这些是存储的实际值。
要保存投票,您必须首先尝试更新表,因为登录的用户可能已经有了投票权。如果更新失败,可能是因为不存在投票,您可以为该帖子的用户插入投票。
为了加快速度,您还可以递增或递减post表本身中的投票计数器。它不会跟踪所有用户,但它确实会跟踪总得分。这样,您就不必查询投票的每个页面视图的sum。但请记住,如果用户将他们的赞成票更改为反对票,您将不得不从该分数中减去2,反之亦然。或者,您可以使用SELECT SUM查询来计算投票,并在每次更改帖子的投票后将其存储在帖子中。因此,在为帖子10投票后,请执行以下操作:
UPDATE posts
SET score = (SELECT SUM(value) FROM votes WHERE postid = 10)
WHERE postid = 10https://stackoverflow.com/questions/17417626
复制相似问题