我正在寻找优化数据库模型的解决方案。数据库管理调查,您可以添加问题并回答它们。条目是调查的答案,并且每个问题都有答案。
这是简化的架构:
有没有办法在不删除条目表的情况下避免冗余?
请记住,我的模型包含更多表格,以便提供更复杂的问题类型。目前我无法提供完整的架构。
答案 0 :(得分: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
,因为此字段是两个主键的一部分{ {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 来建模约束“答案必须与一个问题和一个属于同一调查的条目相关”。