2013-07-02 40 views
0

我很有興趣從頭開始創建這樣的功能來學習,我很難理解並能夠規劃這樣的結構。大多數程序員從我見過的 檢查是否有人已經評論過評論或發表了他們的IP地址,我不喜歡這個特殊原因,因爲每個用戶都必須登錄投票,所以爲什麼不檢查用戶iD 而不是iP。我也傾向於選擇表現而不是表情,所以有人可以幫助我理解如何開始實現這一目標。我已閱讀並搜索了SO(StackOverflow)上的許多帖子 ,但它們對我來說並不太全面。我也在某處讀了一個唯一的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)); 
    } 
} 
+0

是你需要跟蹤對誰額定如果要防止重複收視 – DevZer0

+0

我不能做到這一點通過將帖子表格內的另一列只是比較由用戶iD? – iBrazilian

+0

只有1人可以做評價? – DevZer0

回答

1

如果所有用戶都能夠使用評估每一個職位,你必須有一個具有用戶標識,一個和帖子ID等級值第三個表(votes)(1或-1)。在該表中,您應該將userid和postid組合爲唯一,因爲用戶每個帖子只允許一個投票。

拿到票的總數後,你可以總結這些值:

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

現在,每次給予好評算作一個,每個downvote爲負一,因爲這些都是實際的存儲的值。

要保存一個投票,您必須先嚐試更新表格,因爲登錄的用戶已經可以投票了。如果更新失敗,可能是由於沒有投票,您可以爲該帖子的用戶插入投票。

爲了加快速度,您還可以在郵件表本身增加或減少投票計數器。那個不會跟蹤所有用戶,但它會記錄總分。這樣,您無需爲每個投票的頁面視圖查詢sum。請記住,如果使用者將其贊成變爲downvote,則必須從該分數中減去2,反之亦然。或者,您可以使用SELECT SUM查詢來計算投票並將其存儲在帖子中,每次更改投票的投票後。因此,對於10後參加了投票後,這樣做:

UPDATE posts 
SET score = (SELECT SUM(value) FROM votes WHERE postid = 10) 
WHERE postid = 10 
相關問題