如何避免数据库模型中的冗余?

时间:2013-10-08 11:26:06

标签: mysql database optimization survey redundancy

我正在寻找优化数据库模型的解决方案。数据库管理调查,您可以添加问题并回答它们。条目是调查的答案,并且每个问题都有答案。

这是简化的架构: enter image description here

有没有办法在不删除条目表的情况下避免冗余?

请记住,我的模型包含更多表格,以便提供更复杂的问题类型。目前我无法提供完整的架构。

1 个答案:

答案 0 :(得分:1)

您认为ENTRIES.survey_idQUESTIONS.survey_id是多余的(可能是因为您看到可以通过ANSWERS实体推断出其中一个)。

事实上,QUESTIONSENTRIES会与SURVEYS建立识别关系(如果没有相应的调查,则可能不存在条目或问题)。从形式上讲,他们的主键必须包含对其父表SURVEYS的外键引用:

CREATE TABLE SURVEYS (
    survey_id INT NOT NULL,
    PRIMARY KEY (survey_id)
);

CREATE TABLE QUESTIONS (
    question_id INT NOT NULL,
    survey_id INT NOT NULL,
    PRIMARY KEY (question_id, survey_id),
    FOREIGN KEY (survey_id) REFERENCES SURVEYS(survey_id)
);

CREATE TABLE ENTRIES (
    entry_id INT NOT NULL,
    survey_id INT NOT NULL,
    PRIMARY KEY (entry_id, survey_id),
    FOREIGN KEY (survey_id) REFERENCES SURVEYS(survey_id)
);

作为一个有趣的结果,您的ANSWERS表应该*实际在其外键引用中包含survey_id,因为此字段是两个主键的一部分{ {1}}和QUESTIONS

ENTRIES

如果它可以帮助您释放一个CREATE TABLE ANSWERS ( entry_id INT NOT NULL, survey_id INT NOT NULL, question_id INT NOT NULL, PRIMARY KEY (entry_id, survey_id, question_id), FOREIGN KEY (entry_id, survey_id) REFERENCES ENTRIES(entry_id, survey_id), FOREIGN KEY (question_id, survey_id) REFERENCES QUESTIONS(question_id, survey_id) ); 字段多余的错误印象,请考虑可能存在没有答案的条目(例如,创建新条目时)。在这种情况下,显然需要survey_id


*实际上这个额外的字段 required 来建模约束“答案必须与一个问题和一个属于同一调查的条目相关”。