首页  >  文章  >  数据库  >  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 中存储数组以防止多重投票

问题陈述

您寻求在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn