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

问卷不同问题类型的关系判定:多对多vs一对多设计是否合理?

表关系设计合理性分析与建议

你的设计思路完全合理,完美匹配两类问题的业务特性,相比单表方案更贴合实际场景,以下是具体分析:

一、默认问题采用多对多关系的合理性

默认问题是跨调研复用的标准问题,多对多关系正好满足:

  • 一个默认问题可以被多个调研引用
  • 一个调研可以包含多个默认问题
  • 通过中间关联表(如survey_default_question_links),还能轻松实现自定义排序需求——在关联表中新增sort_order字段即可,同时也能灵活控制哪些默认问题加入某份调研。
  • 归档需求可通过在default_questions表中添加is_archived布尔字段实现,归档后的问题不会影响已关联的历史调研数据。

二、个性化问题采用一对多关系的合理性

个性化问题仅属于特定调研、无复用需求,一对多关系更简洁高效:

  • 在个性化问题表(如custom_survey_questions)中直接通过survey_id外键绑定所属调研,避免了多对多关联表的冗余。
  • 同样在该表中添加sort_order字段即可实现自定义排序,归档需求也通过is_archived字段处理,逻辑清晰,维护成本低。

三、为什么单表方案不合理

将所有问题存入单表会带来两个核心问题:

  1. 数据冗余:个性化问题无复用性,每次新增都要在单表中插入一条新记录,且需要额外字段标记是否为默认/个性化,导致表数据量冗余膨胀。
  2. 维护复杂:后续要区分两类问题的逻辑(如复用、排序、归档)时,需要频繁过滤字段,查询和业务逻辑都会变得繁琐,扩展性差。

参考表结构示例

-- 调研表
CREATE TABLE surveys (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 默认问题表
CREATE TABLE default_questions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    content TEXT NOT NULL,
    is_archived BOOLEAN DEFAULT FALSE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 调研-默认问题关联表(处理多对多+排序)
CREATE TABLE survey_default_question_links (
    survey_id INT,
    default_question_id INT,
    sort_order INT NOT NULL,
    PRIMARY KEY (survey_id, default_question_id),
    FOREIGN KEY (survey_id) REFERENCES surveys(id),
    FOREIGN KEY (default_question_id) REFERENCES default_questions(id)
);

-- 个性化问题表(一对多关联调研+排序)
CREATE TABLE custom_survey_questions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    survey_id INT NOT NULL,
    content TEXT NOT NULL,
    sort_order INT NOT NULL,
    is_archived BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (survey_id) REFERENCES surveys(id)
);

-- 答复表(关联联系人与对应问题)
CREATE TABLE survey_responses (
    id INT PRIMARY KEY AUTO_INCREMENT,
    contact_id INT NOT NULL, -- 关联联系人表
    default_question_id INT NULL,
    custom_question_id INT NULL,
    response_content TEXT NOT NULL,
    FOREIGN KEY (default_question_id) REFERENCES default_questions(id),
    FOREIGN KEY (custom_question_id) REFERENCES custom_survey_questions(id),
    CHECK (default_question_id IS NOT NULL OR custom_question_id IS NOT NULL)
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:52:44