我正在寻找优化我的数据库模型的解决方案。数据库管理调查,您可以添加问题和回答。条目是调查的答案,每个问题都有答案。
这是简化的架构:
有没有办法在不删除条目表的情况下避免冗余?
请记住,我的模型包含更多表格,以便提供更复杂的问题类型。目前我无法提供完整的架构。
我正在寻找优化我的数据库模型的解决方案。数据库管理调查,您可以添加问题和回答。条目是调查的答案,每个问题都有答案。
这是简化的架构:
有没有办法在不删除条目表的情况下避免冗余?
请记住,我的模型包含更多表格,以便提供更复杂的问题类型。目前我无法提供完整的架构。
你有一种感觉,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
显然是需要的。
* 实际上,这个额外的字段是模拟约束“答案必须与属于同一调查的问题和条目相关”所必需的。