2011-05-08 62 views
0

我正在研究一個Java web應用程序中的一個小功能,它非常類似於此處在stackoverflow.com上的投票上/下功能。我有一個如下所示的數據庫:確保數據庫中每個用戶,每個頁面的單一投票數

VOTE TABLE 
id (bigint): surrogate primary key 
question_id (bigint):: the question the vote is for 
vote_type (int): whether the vote is up or down 
user_id (varchar): the username of the person who the vote belongs to 

我想確保每個人每個問題只有一個投票。執行此操作的最佳方式是什麼?如何用我上面描述的數據庫模式強制執行它?

我目前遇到的問題是,當用戶只需要一次投票時,用戶關閉兩張投票請求,然後數據庫包含該用戶的2張「投票」。

回答

1

如果要通過數據庫模式強制執行,正確的方法是使(question_id,user_id)爲唯一鍵。

2

您可以通過主鍵或唯一索引強制執行 - 這兩個概念在數據庫中都非常獨特。將它放在兩列上,Question_id和User_id。每個問題只允許每個用戶輸入1次。這將由數據庫執行,即使您的應用程序代碼讓他們投票兩次,數據庫也會在嘗試插入的第二條記錄上發出錯誤。 (即使您正在使用交易等,數據庫也會正確執行。)

0

只有在user_id和question_id不存在時才執行INSERT,例如,

INSERT INTO TABLE 
-- ALL YOUR FIELDS HERE 
WHERE NOT EXISTS (
SELECT * FROM TABLE WHERE 
    QUESTION_ID = ? AND USER_ID = ? 
) 

但是你可以做USER_ID和question_id主鍵(或其他唯一鍵),所以只有一條記錄物理允許的。

+0

從併發安全和效率的角度來看,這是一個非常糟糕的主意。 – 2011-05-08 19:38:53

相關問題