我正在尋找解決方案來優化我的數據庫模型。數據庫管理調查,您可以添加問題和答案給他們。一個條目是一個調查的答案,併爲每個問題提供答案。如何避免數據庫模型中的冗餘?
這裏是簡化的架構:
有沒有辦法避免冗餘而不刪除條目表?
請記住,我的模型包含更多表格以提供更復雜的問題類型。目前我無法提供完整的模式。
我正在尋找解決方案來優化我的數據庫模型。數據庫管理調查,您可以添加問題和答案給他們。一個條目是一個調查的答案,併爲每個問題提供答案。如何避免數據庫模型中的冗餘?
這裏是簡化的架構:
有沒有辦法避免冗餘而不刪除條目表?
請記住,我的模型包含更多表格以提供更復雜的問題類型。目前我無法提供完整的模式。
你有一種感覺,無論是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
。
*其實這額外的領域是需要來約束「的答案必須涉及到一個問題,一個條目都屬於同一調查」的模式。
感謝您的回答!我擔心從答案中可以(通過連接)通過'QUESTIONS'和'ENTRIES'訪問'SURVEYS'。我明白我沒有別的選擇。我不是混合ID的粉絲。我寧願使用獨特的ID;控制器更容易製造。再次感謝您的解釋。 –
@QuentinWalter我甚至沒有意識到,當我第一次寫我的答案時,需要'ANSWERS.survey_id'(見我的編輯)。然而,這是這些「規則」的相關性的完美例證。您可以放棄表面上複雜的複合主鍵,但在性能方面存在折衷,因爲您需要多個額外的'UNIQUE'約束(並且這些約束實際上應該被認爲是冗餘的)。 – RandomSeed
再次感謝您的所有解釋。我對這些複合PK感到困惑。我曾經用代理PK和FK創建數據庫(對我感到羞恥)。現在我想我理解複合PK的工作方式。 [你可以給我你對整個模型的意見嗎?](http://quentinwalter.com/dev/survey_db_model.png)一些規則:'ITEM'包含每個問題的選擇,每個項目都有一個圖標。 'TYPE'定義每個問題的類型。一個圖標可以屬於一個類別。 [問題]類型可以有一個圖標。 –
謝謝@AbstractChaos修復模式。 –
冗餘在哪裏(外鍵不是冗餘,它們的存在恰恰是爲了避免冗餘信息)?恕我直言,這種結構是唯一可行的。 – RandomSeed
@RandomSeed我同意你的意見,但我對雙重調查問卷引用感到不舒服。條目表中的顯式條目和來自question_id的答案表中的隱式條目。 –