MySQL儲存用戶投票資料時如何防止重複投票?

Mary-Kate Olsen
發布: 2024-10-29 20:18:03
原創
244 人瀏覽過

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

在MySQL 中儲存陣列以防止多重投票

問題陳述

您尋求在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)

如果使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!