我正在進行在線調查。大多數問題的答案爲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可能。
http://stackoverflow.com/questions/1764435/database-design-for-a-survey – Anton 2009-11-19 16:13:47
不要強調數據類型。使它們成爲全部文本,並在代碼中解析它。 – Shawn 2009-11-19 16:23:28
是的,如果我把所有的文本全部寫出來,那麼查詢效率就會降低。假設我有一個答案,這是一個日期,我想做一個日期範圍查詢。嚴肅的編碼!但是,如果答案存儲在日期列類型中,則日期範圍查詢不成問題。 – user151841 2009-11-19 17:32:43