2013-10-08 62 views
2

我正在尋找解決方案來優化我的數據庫模型。數據庫管理調查,您可以添加問題和答案給他們。一個條目是一個調查的答案,併爲每個問題提供答案。如何避免數據庫模型中的冗餘?

這裏是簡化的架構: enter image description here

有沒有辦法避免冗餘而不刪除條目表?

請記住,我的模型包含更多表格以提供更復雜的問題類型。目前我無法提供完整的模式。

+0

謝謝@AbstractChaos修復模式。 –

+0

冗餘在哪裏(外鍵不是冗餘,它們的存在恰恰是爲了避免冗餘信息)?恕我直言,這種結構是唯一可行的。 – RandomSeed

+0

@RandomSeed我同意你的意見,但我對雙重調查問卷引用感到不舒服。條目表中的顯式條目和來自question_id的答案表中的隱式條目。 –

回答

1

你有一種感覺,無論是ENTRIES.survey_idQUESTIONS.survey_id是多餘的(可能是因爲你看到,人們可以推斷出一個或另一個通過ANSWERS實體)。

事實上,QUESTIONSENTRIESSURVEYS(沒有相應的調查可能不存在條目或問題)具有識別關係。從形式上來講,他們的主鍵必須包括一個外鍵引用父表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,因爲本場既是QUESTIONSENTRIES的主鍵的一部分:

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


*其實這額外的領域是需要來約束「的答案必須涉及到一個問題,一個條目都屬於同一調查」的模式

+0

感謝您的回答!我擔心從答案中可以(通過連接)通過'QUESTIONS'和'ENTRIES'訪問'SURVEYS'。我明白我沒有別的選擇。我不是混合ID的粉絲。我寧願使用獨特的ID;控制器更容易製造。再次感謝您的解釋。 –

+1

@QuentinWalter我甚至沒有意識到,當我第一次寫我的答案時,需要'ANSWERS.survey_id'(見我的編輯)。然而,這是這些「規則」的相關性的完美例證。您可以放棄表面上複雜的複合主鍵,但在性能方面存在折衷,因爲您需要多個額外的'UNIQUE'約束(並且這些約束實際上應該被認爲是冗餘的)。 – RandomSeed

+0

再次感謝您的所有解釋。我對這些複合PK感到困惑。我曾經用代理PK和FK創建數據庫(對我感到羞恥)。現在我想我理解複合PK的工作方式。 [你可以給我你對整個模型的意見嗎?](http://quentinwalter.com/dev/survey_db_model.png)一些規則:'ITEM'包含每個問題的選擇,每個項目都有一個圖標。 'TYPE'定義每個問題的類型。一個圖標可以屬於一個類別。 [問題]類型可以有一個圖標。 –