MySQL中能否将Quiz游戏试题选项存为数组以支持动态数量选项需求
首先可以在MySQL中实现动态选项的存储,支持两种常用方案,分别适配不同的业务场景:
方案1:JSON类型存储选项数组(适合小型简单项目)
MySQL 5.7及以上版本支持原生JSON类型,可以直接将选项以数组形式存在单表中,改造成本最低。
操作步骤
- 调整原
Questions表结构,删除固定选项字段,新增JSON类型的选项字段:
ALTER TABLE Questions DROP COLUMN Option_A, DROP COLUMN Option_B, DROP COLUMN Option_C, DROP COLUMN Option_D, ADD COLUMN options JSON NOT NULL COMMENT '存储选项数组,格式示例:["选项1","选项2","选项N"]', MODIFY COLUMN answer VARCHAR(255) NOT NULL COMMENT '存储正确选项内容或对应数组下标';
- 插入数据示例:
INSERT INTO Questions (id, Question, options, answer) VALUES ( 1, '以下属于MySQL支持的数据类型的是?', '["INT","VARCHAR","JSON","OBJECT"]', 'JSON' );
优缺点
- 优点:改造成本极低,单表查询无需关联,选项数量可任意调整
- 缺点:不符合关系型数据库三范式,对选项做复杂统计、模糊查询时性能较差,无法灵活扩展选项的额外属性(如选项排序、选项解析、多正确选项支持等)
方案2:一对多关联表设计(推荐,适配中大型项目/扩展需求多的场景)
这是关系型数据库处理一对多关系的标准实现,一道题对应多个选项,单独建选项表关联,扩展性最强。
操作步骤
- 第一步:清理原
Questions表的冗余字段,仅保留题目核心属性:
ALTER TABLE Questions DROP COLUMN Option_A, DROP COLUMN Option_B, DROP COLUMN Option_C, DROP COLUMN Option_D; -- 调整后表字段:id(题目唯一ID)、Question(题目内容)
- 第二步:新建
Question_Options选项表,和题目表通过question_id关联:
CREATE TABLE Question_Options ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '选项唯一ID', question_id INT UNSIGNED NOT NULL COMMENT '关联题目表的id', option_content VARCHAR(255) NOT NULL COMMENT '选项内容', is_correct TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否为正确选项,1=是,0=否,支持多选', sort_order INT NOT NULL DEFAULT 0 COMMENT '选项排序值,控制前端展示顺序', FOREIGN KEY (question_id) REFERENCES Questions(id) ON DELETE CASCADE ) COMMENT '题目选项表,存储每道题的所有选项';
使用示例
- 新增题目
INSERT INTO Questions (id, Question) VALUES (1, '以下属于关系型数据库的是?');
- 新增对应选项(可任意新增数量)
INSERT INTO Question_Options (question_id, option_content, is_correct, sort_order) VALUES (1, 'MongoDB', 0, 1), (1, 'MySQL', 1, 2), (1, 'Redis', 0, 3), (1, 'PostgreSQL', 1, 4), (1, 'SQLite', 1, 5);
- 查询某道题的完整信息
SELECT q.Question, qo.option_content, qo.is_correct FROM Questions q LEFT JOIN Question_Options qo ON q.id = qo.question_id WHERE q.id = 1 ORDER BY qo.sort_order ASC;
优缺点
- 优点:完全符合数据库设计规范,支持多选、选项排序、选项扩展属性新增、选项相关统计等各类需求,性能稳定
- 缺点:需要操作两张表,比单表JSON方案多一次关联查询
选型建议
如果是小型个人项目,业务逻辑简单无扩展需求,选JSON方案即可;如果是正式上线的项目,后续有功能扩展可能,优先选关联表方案。
内容的提问来源于stack exchange,提问作者Science Meetup
相关产品推荐
相关产品推荐

