Обеспечить один голос за пользователя, за страницу, в базе данных - PullRequest
0 голосов
/ 08 мая 2011

Я работаю над небольшой функцией в веб-приложении Java, которая очень похожа на функцию голосования вверх / вниз здесь, на 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 ]

2 голосов
/ 08 мая 2011

Вы можете принудительно применить это через первичный ключ или уникальный индекс - обе концепции довольно универсальны в базах данных. Поместите его в две колонки вместе, Question_id и User_id. Это позволило бы только 1 запись на пользователя, на вопрос. Это будет применяться базой данных, даже если коды вашего приложения позволяют им голосовать дважды, база данных выдаст ошибку при попытке вставить вторую запись. (Даже если вы используете транзакции и т. Д., База данных будет принудительно применять их.)

1 голос
/ 08 мая 2011

Если вы хотите применить его через схему базы данных, правильный способ - сделать (question_id, user_id) уникальным ключом.

0 голосов
/ 08 мая 2011

ВСТАВЛЯЙТЕ только когда user_id и question_id НЕ СУЩЕСТВУЮТ, например,

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

Однако вы можете сделать user_id и question_id Первичным ключом (или другим уникальным ключом), поэтому физически разрешена только одна запись.

...