You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多选项投票系统数据库Schema正确性验证请求

投票系统数据库Schema约束验证分析

针对你提出的三个约束,逐一验证如下:

1. 同一guild下不能存在ID重复的poll

guilds_polls表的主键设置为(guild_id, poll_id),复合主键的唯一性约束直接保证了同一个guild_id下,poll_id不会重复,完全符合该约束要求。

2. 同一poll下不能存在ID重复的选项

guilds_polls_choices表的主键是(guild_id, poll_id, choice_id),由于一个poll是由guild_id + poll_id唯一标识的(关联自guilds_polls的主键),这个复合主键确保了同一个poll下,choice_id不会重复,满足约束要求。

3. 用户不能对同一poll的同一选项重复选择

guilds_polls_user_choices表的主键为(guild_id, poll_id, user_id, choice_id),四个字段的组合唯一性约束,直接限制了同一个用户在同一个poll中,无法重复选择同一个选项,完全符合该约束。

额外提示

注意到guilds_polls_choices中的choice_id是INT类型,而guilds_polls_user_choices中的choice_id是BIGINT类型,虽然不影响当前约束的生效,但建议统一两者的数据类型,避免后续关联操作时出现不必要的类型转换问题。

附原建表代码:

CREATE TABLE IF NOT EXISTS guilds_polls
(
    guild_id BIGINT     NOT NULL,
    poll_id  varchar(8) NOT NULL,
    PRIMARY KEY (guild_id, poll_id),
    FOREIGN KEY (guild_id) REFERENCES guilds (id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS guilds_polls_choices
(
    guild_id  BIGINT       NOT NULL,
    poll_id   varchar(8)   NOT NULL,
    choice_id INT          NOT NULL,
    choice    VARCHAR(255) NOT NULL,
    PRIMARY KEY (guild_id, poll_id, choice_id),
    FOREIGN KEY (guild_id, poll_id) REFERENCES guilds_polls (guild_id, poll_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS guilds_polls_user_choices
(
    guild_id  BIGINT     NOT NULL,
    poll_id   varchar(8) NOT NULL,
    choice_id BIGINT     NOT NULL,
    user_id   BIGINT     NOT NULL,
    PRIMARY KEY (guild_id, poll_id, user_id, choice_id),
    FOREIGN KEY (guild_id, poll_id) REFERENCES guilds_polls (guild_id, poll_id) ON DELETE CASCADE
);

内容的提问来源于stack exchange,提问作者Flavio Moreno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:50:45