2

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

这是简化的架构: 在此处输入图像描述

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

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

4

1 回答 1

1

你有一种感觉,ENTRIES.survey_id或者QUESTIONS.survey_id是多余的(可能是因为你看到一个人可以通过ANSWERS实体推断出一个或另一个)。

事实上,QUESTIONS并与(如果没有相应的调查,条目或问题可能不存在)ENTRIES具有识别关系。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在它的外键引用中,因为这个字段是和的主键的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,请考虑可能存在一个没有答案的条目(例如,当创建一个新条目时)。在这种情况下,ENTRIES.survey_id显然是需要的。


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

于 2013-10-08T13:56:04.243 回答