2013-05-03 76 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 

这是更具可扩展性,并基本上将您的上一个表中的字段转换为答案表中的值。因此,您可以随时添加新的“类型”,无需在模式中添加新字段即可回答问题和答案。