类似表的SQL设计,列差异很小

时间:2017-08-18 15:33:08

标签: sql database database-design

我正在处理一个处理问题和答案的应用程序。我的答案可以是不同类型,包括int,text,image,option等。我想知道将它们分成如下所示的不同表格是否是一个好习惯?

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

我考虑将所有这些聚合到一个单独的答案表中,然后它将填充可空字段,如果我不小心,我担心可能会引入一些错误。这是一个好主意还是这个设计是分离不同类型答案的好方法?或许还有更好的方法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

一个表(对于所有答案),四个表(对于每种答案类型)或五个表(一个用于所有答案,然后一个对每种类型特定)的问题取决于两个因素。

最重要的是:如何使用数据?第二个是:你使用的是什么数据库?

首先让我免除第二部分。一些数据库(特别是Postgres)内置了对表继承的支持。你可以阅读[文档]; 1;它可能会做你想要的。

对于其他数据库,您如何选择?好吧,你有一张AnswerId的表格。这表明您需要一个具有自动生成的主键的实体。

那么,您是否将所有信息存储在该表中?将所有列放在单个表中的一个论点是简单性:所有数据都在一个地方。您可以使用NULL约束强制执行check - 值。一个缺点是添加新类型需要修改表。

另一种选择是拥有每个特定的表。他们可以使用AnswerId作为主键,并将其作为Answers的外键。这使得它们各自添加新类型。但是,确保答案只有一种类型可能很麻烦。连接有点复杂。

在大多数情况下,我倾向于使用一个表格和列的增加,特别是如果我事先知道预期的类型范围。