ユーザー 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 ストレージ エンジンを使用する場合は、参照整合性を確保するために外部キー制約を追加することを検討してください:
... 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 のみを参照することが保証されます。
このソリューションには、単一のデータベース フィールド内に配列を格納する場合に比べて、いくつかの利点があります。
以上がユーザー投票データを保存するときに MySQL で重複投票を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。