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

注册表单关联听力健康问题的最优存储方案

听力健康问卷动态配置与查询最优方案

核心数据库表结构设计

不需要单独的Answer选项表,仅需3张核心表即可覆盖需求,减少不必要的关联复杂度:

  • participants 表(存储参与者基础固定信息)
    主键:participant_id
    常规字段:name、address、submit_time等注册类属性
  • questions 表(存储动态配置的问卷问题,核心设计点)
    主键:question_id
    关键字段:
    • question_code:唯一字符串编码,例如has_hearing_problem、ear_problem_side、hearing_aid_type,后续查询全靠这个字段,避免硬编码数字ID导致的可读性、可维护性问题
    • question_text:前端展示的问题内容
    • question_type:问题类型枚举,可选值boolean/single_choice/multiple_choice/text,用于前端自动渲染对应表单控件
    • options:JSON类型,存储选择题的可选选项,例如["是", "否"]、["左耳", "右耳", "双耳"]
    • is_active:布尔类型,标记问题是否当前启用,下线旧问题时不需要删除数据,不影响历史答案查询
  • participant_answers 表(存储参与者提交的单题答案)
    主键:answer_id
    关键字段:
    • participant_id:关联参与者表主键
    • question_id:关联问题表主键
    • answer_value:存储答案内容,布尔题存0/1、选择题存选项值、文本题存输入内容
      联合唯一索引:(participant_id, question_id),避免同一个参与者的同一个问题重复提交

常见查询场景实现

所有查询都可以通过简单的关联SQL实现,因为使用了question_code作为标识,语句可读性非常高:

1. 查询所有存在听力健康问题的参与者

SELECT DISTINCT p.*
FROM participants p
INNER JOIN participant_answers pa ON p.participant_id = pa.participant_id
INNER JOIN questions q ON pa.question_id = q.question_id
WHERE q.question_code = 'has_hearing_problem' AND pa.answer_value = '是';

2. 查询左耳存在听力问题的参与者

SELECT DISTINCT p.*
FROM participants p
INNER JOIN participant_answers pa ON p.participant_id = pa.participant_id
INNER JOIN questions q ON pa.question_id = q.question_id
WHERE q.question_code = 'ear_problem_side' AND pa.answer_value = '左耳';

3. 查询使用特定类型助听设备的参与者

SELECT DISTINCT p.*
FROM participants p
INNER JOIN participant_answers pa ON p.participant_id = pa.participant_id
INNER JOIN questions q ON pa.question_id = q.question_id
WHERE q.question_code = 'hearing_aid_type' AND pa.answer_value = '耳背式助听设备';

多条件组合查询示例(存在听力问题且使用耳背式助听设备)

SELECT DISTINCT p.*
FROM participants p
WHERE EXISTS (
    SELECT 1 FROM participant_answers pa1 
    INNER JOIN questions q1 ON pa1.question_id = q1.question_id
    WHERE pa1.participant_id = p.participant_id 
    AND q1.question_code = 'has_hearing_problem' 
    AND pa1.answer_value = '是'
) AND EXISTS (
    SELECT 1 FROM participant_answers pa2 
    INNER JOIN questions q2 ON pa2.question_id = q2.question_id
    WHERE pa2.participant_id = p.participant_id 
    AND q2.question_code = 'hearing_aid_type' 
    AND pa2.answer_value = '耳背式助听设备'
);

性能优化建议

  • 给questions表的question_code字段加唯一索引,给participant_answers表的(question_id, answer_value)加联合索引,查询性能可以提升数倍
  • 如果数据量超过10万、查询场景非常多,可定时生成问卷宽表,把每个问题作为宽表的单独字段(例如has_hearing_problem、left_ear_problem直接作为列),查询时不需要多表关联,性能更好
  • 前端渲染问卷时直接拉取is_active=1的问题列表即可,完全不需要硬编码HTML,问卷调整零代码修改

方案优势

  • 完全解耦前端和问卷内容,问卷新增、修改、下线仅需操作数据库,不需要发布代码
  • 查询逻辑清晰易维护,依赖语义化的question_code作为唯一标识,不需要记住无意义的数字问题ID
  • 扩展性极强,后续新增任意问题、新增任意查询场景都不需要修改表结构,仅需新增questions表数据和对应查询逻辑即可
  • 兼容历史数据,旧问题下线仅需修改is_active字段,历史答案不会丢失,仍然支持回溯查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:09:02