MySQL存储用户投票数据时如何防止重复投票?

Mary-Kate Olsen
发布: 2024-10-29 20:18:03
原创
246 人浏览过

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学习者快速成长!