2009-05-01 120 views
6

我正在研究一個PHP應用程序,它有幾個可以評論的對象。每個評論都可以投票,用戶可以給它+1或-1(如Digg或Reddit)。現在我正計劃擁有一張載有user_id及其投票信息的「投票」表,這似乎工作正常。評論投票數據庫結構的最佳做法

問題是,每個對象都有數百個註釋存儲在單獨的註釋表中。在我加載評論之後,我必須對票進行總結,然後逐個檢查每位投票者,以確保他們只能投票一次。這工作,但似乎真的是數據庫密集型 - 很多隻是評論的查詢。

是否有一個更簡單的方法來減少數據庫密集度?我目前的數據庫結構是最好的方法嗎?

更清晰瞭解當前的數據庫結構:

評論表:

  • USER_ID
  • OBJECT_ID
  • total_votes

投票表:

  • COMMENT_ID
  • USER_ID
  • 投票

最終目標:

  • 允許用戶在每個評論有至少#MySQL的查詢只有一次投票(每個對象有多條評論)

回答

8

要確保每個選民只投票一次,請在這些字段中設計您的投票表— CommentID,UserID,VoteValue。使CommentID和UserID成爲主鍵,這將確保一個用戶只有一個投票。然後,要查詢投票評論,做這樣的事情:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

這有幫助嗎?

+0

實際上幫助很大,謝謝!有關兩個主鍵的想法甚至沒有跨過我的想法。 – mdolon 2009-05-01 02:26:00

0

爲什麼不保存每個評論的總計票數?當新的投票發生時增加/減少。

然後,您必須檢查用戶是否投票專門針對此評論,以允許每個用戶的每條評論只有一個投票。

+0

訣竅在於第二部分,檢查用戶是否已投票支持該特定評論 - 它基本上導致擁有單獨的投票表。 – mdolon 2009-05-01 02:22:55

0

你可以把SQL連接條件,它返回由該對象的當前用戶提出的意見所有的選票,如果你沒有行,用戶還沒有投票。這與您在程序中逐一檢查每條評論略有不同。

就數據庫結構而言,保持這些東西是分開的,這似乎是完全合乎邏輯的。投票{user_id,object_id,object_type,vote_info ...)

您可能已經在做這件事,對不起,但我無法從您的帖子中解釋,如果是這樣的話。