2013-05-03 81 views
0

說我有兩個問題類型:多選和範圍。範圍問題允許用戶通過在他們的答案中指定一個範圍的值來回答(例如1-10或2-4)。針對多種相似類型的數據庫設計?

我繼承在回答這些問題的類型存儲在其中的結構,像這樣同一個表的數據庫:

Answers 
------- 
Id 
QuestionId 
choice 
range_from 
range_to 

這將導致數據如下圖所示:

1 1 null 1  10 
2 1 null 2  4 
3 2 Pants null null 
4 2 Hat null null 

它是否有意義在答案表中包含每個答案類型的列?還是應該把它們分解成單獨的表格?

這是我的真實數據庫的一個非常苗條的版本。實際上,大約有8個問題類型,所以每個答案都有幾個未使用的列。

+0

可能的[數據庫繼承技術]的重複?(http://stackoverflow.com/questions/386652/techniques-for-database-inheritance) – mbeckish 2013-05-03 00:06:25

+0

伊莫你應該有一個主表,它說什麼樣的問題是,那麼問題本身將存儲在只有它所需字段的表中。 – Patashu 2013-05-03 00:08:32

回答

0

在答案表中包含來自每個答案類型的列是否有意義?

這是「在同一個表中的所有分類」策略實現繼承,這適用於少數類。隨着班級數量的增長,您可能會考慮other strategies之一。沒有預定義的「切點」 - 你必須自己衡量和決定。

另一種方法是類似於EAV的系統as proposed by blotto,但這會將數據一致性的實施從數據庫管理系統移開。如果您在設計時不知道數據結構並希望在運行時避免使用DML,那麼這是一個有效的解決方案,但如果您確實知道設計時的數據結構更適合繼承。

0

您可以有一個表示問題'類型'的字段,它似乎最適合在問題表(而不是答案表)中使用。例如:

question_type ENUM('choice', 'range', 'type_3', 'type_4'..) 

然後做出一個一對多鏈路(連接表)表示問題到答案的關係

AnswerId (pk) | QuestionId (fk) 
1    1 
2    1 
3    2 
4    2 

最後,你的回答表是值的集合爲每個答案。它可以通過擁有自己的ENUM來更具體地指定每條記錄。

answer_type ENUM('low_range', 'high_range', 'choice', etc) 

Id (pk)| AnswerId (fk) | Type  | Value 
1  1    low_range  1 
2  1    high_range  10 
3  2    low_range  2 
4  2    high_range  4 
5  3    choice   Pants 
6  4    choice   Hat 

這是更具可擴展性,並基本上將您的上一個表中的字段轉換爲答案表中的值。因此,您可以隨時添加新的「類型」,無需在模式中添加新字段即可回答問題和答案。