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 种问题类型,因此每个答案都有几列未使用。

4

2 回答 2

0

您可以有一个表示问题“类型”的字段,这似乎最适合问题表(而不是答案表)。例如:

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

然后创建一个表示 Question-to-Answers 关系的一对多链接(连接表)

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

最后,您的 Answer 表是每个 Answer 的值的集合。它可以通过拥有自己的 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

这更具可扩展性,并且基本上将您以前表中的字段转换为答案表中的值。因此,您始终可以为问题和答案添加新的“类型”,而无需向架构添加新字段。

于 2013-05-03T00:31:42.947 回答
0

在答案表中包含每个答案类型的列是否有意义?

这是实现继承的“同一张表中的所有类”策略,适用于少量类。随着班级数量的增加,您可能会考虑使用其他策略之一。没有预定义的“截止点” - 您必须自己衡量和决定。

替代方案将是由 blotto 提出的类似 EAV 的系统,但这会将数据一致性的执行从 DBMS 转移。如果您在设计时不知道数据结构并希望在运行时避免 DML,那么这是一个有效的解决方案,但如果您在设计时知道数据结构,则最好坚持继承。

于 2013-05-03T17:19:33.330 回答