我正在研究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'投票',而他们只应该有一票。
答案 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设为主键(或其他唯一键),因此物理上只允许一条记录。