多个相似类型的数据库设计?

时间:2013-05-03 00:01:06

标签: database database-design

假设我有两种问题类型:多选和范围。范围问题允许用户通过在答案中指定一系列值来回答(例如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种问题类型,因此每个答案都有几列未使用。

2 个答案:

答案 0 :(得分: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

这更具可扩展性,并且基本上将前一个表中的字段转换为答案表中的值。因此,您可以随时添加新的“类型”,以便在不向模式添加新字段的情况下解答问题。

答案 1 :(得分:0)

  

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

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

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