题库业务需采用“主表+子表”设计,按题型分表存储,结合标签体系与智能检索,并通过QuestionService解耦考试模块。

题库业务是答题系统的核心,Yii框架下实现需兼顾数据结构合理性、业务逻辑清晰性与扩展性。重点在于题型抽象、题目管理、分类标签、难度控制及与考试流程解耦。
题型建模与数据库设计
避免用单一表存储所有题目,应采用“主表+子表”或EAV(属性-值)混合方式。推荐方案:
- question_base:统一字段如id、title、type(单选/多选/判断/填空/简答)、difficulty、status、created_at等
- question_choice:关联choice_id,存选项内容、是否正确、排序序号(仅用于选择题)
- question_fill_blank:存空位标记(如{1}、{2})及对应答案数组(JSON格式或独立行)
- question_tag_rel:多对多关系表,连接题目与标签(知识点、章节、考试大纲条目)
题目增删改查与批量操作
利用Yii的ActiveRecord和Gii生成基础CRUD,再针对性增强:
- 导入支持Excel(用phpoffice/phpspreadsheet),校验格式后批量插入,失败行返回具体错误位置
- 编辑页按题型动态渲染表单(用Yii::$app->view->renderAjax()加载不同field模板)
- 软删除+回收站机制:status字段区分“启用/禁用/已删除”,后台可还原或清空
- 题目复制功能:保留原题干和基础属性,重置ID、清空答案/选项ID,避免外键冲突
标签体系与智能检索
题库规模增长后,纯关键词搜索效率低,需结构化标签支撑精准筛选:
- 标签分层级:一级为学科(如“PHP”),二级为模块(如“Yii框架”),三级为知识点(如“ActiveRecord事务”)
- 后台支持拖拽排序、父子绑定、批量打标;前端筛选器用级联下拉+多选Tag组件
- 搜索时组合条件:按标签+难度+题型+时间范围,SQL中用JOIN+GROUP BY去重,避免重复题目出现在结果中
与考试模块松耦合对接
题库不直接参与组卷逻辑,而是提供稳定接口供考试服务调用:
- 定义QuestionService类,封装获取题目方法:getRandomByTags($tags, $count, $difficultyRange)
- 考试创建时,只保存题目ID列表(或快照JSON),不实时关联题库记录,防止题目被修改影响历史试卷
- 支持“题目快照”:生成试卷时将题干、选项、答案等关键字段冗余到exam_paper_question表,保障长期一致性


















