确保在数据库中为每个用户(每页)进行单一投票

时间:2011-05-08 16:17:00

标签: java database concurrency unique-constraint

我正在研究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'投票',而他们只应该有一票。

3 个答案:

答案 0 :(得分:2)

您可以通过主键或唯一索引强制执行 - 这两个概念在数据库中都是非常不可靠的。将它放在两列上,Question_id和User_id。每个问题只允许每个用户输入1个。这将由数据库强制执行,即使您的应用程序代码允许他们投票两次,数据库也会在尝试插入的第二个记录上引发错误。 (即使您正在使用事务等,数据库也会正确执行它。)

答案 1 :(得分:1)

如果要通过数据库架构强制执行它,正确的方法是使(question_id,user_id)成为唯一键。

答案 2 :(得分:0)

仅在user_id和question_id NOT EXISTS时执行INSERT,例如

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

但是,您可以将user_id和question_id设为主键(或其他唯一键),因此物理上只允许一条记录。