2009-11-19 78 views
4

我正在進行在線調查。大多數問題的答案爲1-5。如果我們需要在調查中添加一個問題,我使用一個簡單的網絡表單,它將INSERT插入到適當的表格中,然後瞧!調查都在問新的問題 - 沒有新的代碼或者改變數據庫結構。針對不同數據類型的答案進行調查的SQL設計

我們被要求添加可以具有不同數據類型的答案的調查問題。規範是讓調查「可配置」,以便在將來任何時候,當有人說,「我們需要一個新的調查,詢問{文本答案問題},{1-5問題},{真正的錯誤問題} ,{以日期作爲答案的問題}「,我們可以在不改變數據庫結構的情況下做到這一點。

我試圖想保存這些答案的最佳途徑,但每次我的方法拿出似乎有點hackish的。

有些問題可能有答案是肯定/否定或者是真/假答案,有些答案可能會有一個整數答案(「過去一個月中有多少次使用過技術支持?」),另一個答案可能有一個日期,一個字符串,具有單一值的多項選擇,具有多個值的多項選擇等等。或者有時候,特定答案值可能會提示子問題(「你對...感到失望嗎?」)

簡單解決方法是將每個問題作爲調查中的一列,將其答案作爲調查中的一列,以及是否將其作爲調查中的一列。這對我來說感覺很糟糕 - 這是一張大桌子;不是很「關係」。

集思廣益,「最好」的方法,我能想出是爲每個答案類型不同的表,但是,感覺容易受數據完整性問題。換句話說,我會

CREATE TABLE `Questions` (...); 
CREATE TABLE `TrueFalseAnswers` (...); 
ALTER TABLE `TrueFalseAnswers` 
    ADD CONSTRAINT `TrueFalseAnswers_ibfk_1` FOREIGN KEY (`question_id`) 
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 
CREATE TABLE `TextAnswers` (...); 
ALTER TABLE `TextAnswers` 
    ADD CONSTRAINT `TextAnswers_ibfk_1` FOREIGN KEY (`question_id`) 
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

的一個問題與上面的是,我不能保證至少有一個且只有一個答案存在於單獨的DDL任何問題。

另一種解決方案可能是有在問表的答案二進制或字符串列,以及編碼所有的答案到了一些字符串或二進制格式,並將它們存儲在回答列。這給了我每個問題至少一個且只有一個答案,但是隨後我無法訪問SQL查詢中的聚合特性。這讓我覺得不是一個「關係型」解決方案。

所以,我看到上面概述的問題。有沒有解決這個問題的「最佳」方法?

既然我已經花時間描述了這個問題和我的想法,似乎我提出的一個廣泛問題是「我想存儲任意類型的數據而不進行任何編碼.. 「這是無望的嗎?

我使用的是MySQL,所以我不能夠訪問的東西,其他的RDBMS可能。

+0

http://stackoverflow.com/questions/1764435/database-design-for-a-survey – Anton 2009-11-19 16:13:47

+0

不要強調數據類型。使它們成爲全部文本,並在代碼中解析它。 – Shawn 2009-11-19 16:23:28

+0

是的,如果我把所有的文本全部寫出來,那麼查詢效率就會降低。假設我有一個答案,這是一個日期,我想做一個日期範圍查詢。嚴肅的編碼!但是,如果答案存儲在日期列類型中,則日期範圍查詢不成問題。 – user151841 2009-11-19 17:32:43

回答

7

使用指定答案類型的列,但將答案存儲爲文本。您的應用程序或前端可以使用answer_type列來確定向最終用戶顯示的內容(測試框,單選按鈕,日期選擇器)以及在將其發回數據庫之前如何驗證它。

+1

這完全是我們軟件中的問卷系統的功能,它工作得很好。正如Randolpho所說,使用正常的關係數據庫並不是一個完美的解決方案,它需要很好的代碼來進行分類。 – 2009-11-19 16:46:01

2

您想要創建一個與QuestionType類相對應的QuestionType表。允許用戶填寫的持久答案爲自由格式文本,並將其留給QuestionType以確定答案的含義。

所以 - 如果這是真/假,答案可能是「T」或「F」。

如果是多項選擇,則答案可以是所選選項的索引。

如果它是一個文本框,用戶填寫,保存他們輸入文本。

2

我假扮的是「我想存儲一個任意類型的數據而不做任何編碼...」這是無望的嗎?

是的,它幾乎是。對於您構成的問題沒有「好」的解決方案。 「最佳」是戴維Swersky和拉里·勒斯蒂格描述的那樣:

一個問題表,存儲的問題,可能的答案(如果是選擇題)和問題類型

的回答表,用於存儲回答問題(FK到問題表),作爲文本序列化。 Varchar(4000)或TEXT數據類型,除非絕對必要,最好是前者。

這取決於您的應用程序邏輯,根據爲問題指定的類型確定值的含義。

0

你也可以使用dataType指定的表,所以一個表的整數,日期,字符串等。 從那裏,1個答案表,將問題(表)鏈接到正確的dataType表+主鍵。

要對帶有答案的所有問題進行一個概述,您可以在其上創建一個視圖,只需將所有數據類型轉換爲視圖中的文本即可。

相關問題