ホームページ > データベース > mysql チュートリアル > ユーザー投票データを保存するときに MySQL で重複投票を防ぐにはどうすればよいですか?

ユーザー投票データを保存するときに MySQL で重複投票を防ぐにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-10-29 20:18:03
オリジナル
332 人が閲覧しました

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)
);
ログイン後にコピー

comments_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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート