>  기사  >  데이터 베이스  >  사용자 투표 데이터를 저장할 때 MySQL에서 중복 투표를 방지하는 방법은 무엇입니까?

사용자 투표 데이터를 저장할 때 MySQL에서 중복 투표를 방지하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-29 20:18:03246검색

How to Prevent Duplicate Votes in MySQL When Storing User Voting Data?

복수 투표 방지를 위해 MySQL에 배열 저장

문제 설명

사용자 ID 배열을 저장하기 위해 MySQL에 테이블을 생성하려고 합니다. 댓글에 투표한 사람입니다. 이렇게 하면 동일한 댓글에 대해 동일한 사용자가 여러 번 투표하는 것을 방지하는 것이 목표입니다.

해결 방법

comments_votes라는 별도의 테이블을 사용하여 서로 다대다 관계를 설정하는 것이 좋습니다. 댓글과 사용자 테이블. 다음 스키마는 기초를 제공합니다.

CREATE TABLE comments (
    comment_id int,
    body varchar(100),
    PRIMARY KEY (comment_id)
);

CREATE TABLE users (
    user_id int,
    username varchar(20),
    PRIMARY KEY (user_id)
);

CREATE TABLE comments_votes (
    comment_id int,
    user_id int,
    vote_type int,
    PRIMARY KEY (comment_id, user_id)
);

comment_votes의 복합 기본 키(comment_id, user_id)는 사용자가 동일한 댓글에 여러 번 투표하는 것을 방지합니다.

사용 예

보여줄 데이터 삽입:

INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');

INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');

사용자 1에 대한 투표 추가:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);

이전에 투표한 댓글에 다시 투표하려고 하면 고유한 오류로 인해 오류가 발생합니다. 기본 키 제약 조건:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

외래 키 고려 사항(InnoDB만 해당)

InnoDB 스토리지 엔진을 사용하는 경우 참조 무결성을 보장하기 위해 외래 키 제약 조건을 추가하는 것이 좋습니다.

...
CREATE TABLE comments (
    ...
) ENGINE=INNODB;

CREATE TABLE users (
    ...
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    ...
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

이러한 외래 키는 comments_votes가 유효한 댓글 ID와 사용자 ID만 참조하도록 보장합니다.

이 접근 방식의 장점

이 솔루션은 단일 데이터베이스 필드 내에 배열을 저장하는 것보다 여러 가지 이점을 제공합니다.

  • 참조 무결성 시행: 외래 키는 데이터 일관성을 보장하고 관계 끊어짐을 방지합니다.
  • 유연성 제공: vote_type 열은 향후 투표 확장을 허용합니다( 예: 찬성/비추천).
  • 성능 향상: 투표를 위해 별도의 테이블을 사용하면 효율적인 쿼리 및 인덱싱이 가능합니다.

위 내용은 사용자 투표 데이터를 저장할 때 MySQL에서 중복 투표를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.