假设我有两种问题类型:多选和范围。范围问题允许用户通过在答案中指定一系列值来回答(例如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 :(得分: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,那么这是一个有效的解决方案,但如果您确实知道设计时数据的结构,那么最好坚持继承。