问卷不同问题类型的关系判定:多对多vs一对多设计是否合理?
表关系设计合理性分析与建议
你的设计思路完全合理,完美匹配两类问题的业务特性,相比单表方案更贴合实际场景,以下是具体分析:
一、默认问题采用多对多关系的合理性
默认问题是跨调研复用的标准问题,多对多关系正好满足:
- 一个默认问题可以被多个调研引用
- 一个调研可以包含多个默认问题
- 通过中间关联表(如
survey_default_question_links),还能轻松实现自定义排序需求——在关联表中新增sort_order字段即可,同时也能灵活控制哪些默认问题加入某份调研。 - 归档需求可通过在
default_questions表中添加is_archived布尔字段实现,归档后的问题不会影响已关联的历史调研数据。
二、个性化问题采用一对多关系的合理性
个性化问题仅属于特定调研、无复用需求,一对多关系更简洁高效:
- 在个性化问题表(如
custom_survey_questions)中直接通过survey_id外键绑定所属调研,避免了多对多关联表的冗余。 - 同样在该表中添加
sort_order字段即可实现自定义排序,归档需求也通过is_archived字段处理,逻辑清晰,维护成本低。
三、为什么单表方案不合理
将所有问题存入单表会带来两个核心问题:
- 数据冗余:个性化问题无复用性,每次新增都要在单表中插入一条新记录,且需要额外字段标记是否为默认/个性化,导致表数据量冗余膨胀。
- 维护复杂:后续要区分两类问题的逻辑(如复用、排序、归档)时,需要频繁过滤字段,查询和业务逻辑都会变得繁琐,扩展性差。
参考表结构示例
-- 调研表 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
相关产品推荐
相关产品推荐

