多选项投票系统数据库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
相关产品推荐
相关产品推荐

