Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似表的SQL设计,列差异很小_Sql_Database_Database Design - Fatal编程技术网

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

类似表的SQL设计,列差异很小,sql,database,database-design,Sql,Database,Database Design,我正在开发一个处理问题和答案的应用程序。我的答案可以是不同的类型,包括int、text、image、option等。。我想知道把它们分成下面这样的不同表格是否是一种好的做法 Question QuestionAnswer -------- ------------- int Id int QuestionId int typeId int AnswerId TextAnswer Ima

我正在开发一个处理问题和答案的应用程序。我的答案可以是不同的类型,包括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
我曾考虑将所有这些集合到一个答案表中,但随后它将被可为空的字段填充,如果我不小心的话,我担心这可能会引入一些错误。这是一个好主意,还是这种设计在区分不同类型的答案方面是一种良好的做法?或者有没有更好的方法?谢谢

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

最重要的是:数据将如何使用?第二个问题是:您使用的是什么数据库

让我先省去第二部分。一些数据库(尤其是Postgres)内置了表继承支持。您可以阅读[文档]; ; 它可能是你想要的

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

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

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

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