您尋求在MySQL 中建立一個表格來儲存使用者ID 陣列誰來評論進行了投票。透過這樣做,您的目的是防止同一用戶對同一則評論進行多次投票。
考慮使用單獨的表 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中文網其他相關文章!