2017-08-18 25 views
0

我正在研究處理問題和答案的應用程序。我的答案可以是從int,text,image,option等不同的類型。我想知道把它們分成不同的表格是否是一種很好的做法?針對列差異很小的類似表的SQL設計

Question   QuestionAnswer 
--------   ------------- 
int Id    int QuestionId 
int typeId   int AnswerId 

TextAnswer   ImageAnswer OptionAnswer  IntAnswer 
----------   ----------- ------------  --------- 
int AnswerId  int AnswerId int AnswerId  int AnswerId 
nvarchar Value  binary Value int Value   int Value 
            int OptionTypeId 

我想到了聚合所有這些爲一個單一的答案表,但隨後就會充滿可空字段和我怕如果我不小心,可能引入一些錯誤。這是一個好主意嗎?還是這種設計是分離不同類型答案的好實踐?或者也許有更好的方法呢?謝謝!

回答

0

一個表(適用於所有的答案)的問題,四個表(每個類型的答案),或五個表(一個用於所有的答案,然後一個具體到每種類型)取決於兩個因素。

最重要的是:數據如何使用?第二個是:你在用什麼數據庫?

讓我先放棄第二部分。有些數據庫(特別是Postgres)內置了對錶繼承的支持。你可以閱讀[documentation]; 1;它可能做你想要的。

對於其他數據庫你如何選擇?那麼,你有一張表格,裏面有AnswerId。這表明您需要一個具有自動生成的主鍵的實體。

所以,你存儲在該表或不是所有的信息?將所有列放在一張表中的一個理由很簡單:所有數據都在一個地方。您可以使用check約束強制執行值的NULL。一個缺點是添加一個新類型需要修改表格。

另一種選擇是每個特定的表。他們可以使用AnswerId作爲主鍵,並將其作爲Answers的外鍵。這使得它每個添加新的類型。但是,確保答案只有一種類型可能會很麻煩。連接有點複雜。

在大多數情況下,我會傾向於使用一張表和列的擴散,特別是如果我事先知道預期類型的​​範圍。