我正在为一个应用程序设计数据库,在该应用程序中向用户提出问题,他必须回答这些问题。无论是作为调查问卷还是作为问答游戏,这个概念都适用于两者。我计划:
由于许多问题都是常见的情况,例如是/否,我决定为每个问题指定一个“问题类型”枚举。例如,如果应用程序看到是/否问题,则表示数据库中没有答案,应用程序将自动添加两个答案,“是”和“否”。这在答案表中节省了数百或数千个无用的行。
但是,我不确定如何定义表来记录用户的答案。如果没有特殊类型的问题,我只会记录问题ID,答案ID和用户ID,这意味着“用户X回答Y问题Z”。但是,“是/否”问题在表格中没有匹配的答案,因此我无法使用答案ID。
即使在问题之间分享答案(通过在问题和答案之间建立多对多关系)也不是一个好的解决方案。当然,它允许我将“是”和“否”定义为常规答案,但是应用程序应该知道“是/否”问题使用答案(比如说)7和8 - 或者,当创建“是/否”时没有“问题答案7和8应该受到这个问题的约束。但这意味着这些“特殊”答案的ID必须在其他地方硬编码。此外,如果我将来添加更多特殊类型的问题,这将无法很好地扩展。
我该怎么办?理想情况下,我需要在“用户答案”表的每一行中存储固定值或答案表的外键。有没有比使用两列更好的解决方案,其中一列是NULL?
我正在使用SQL Server,如果这很重要的话。
答案 0 :(得分:1)
根据您的描述,我想我会继续向表中添加另一列并使FK列可以为空。
对于那些特殊问题,您可能只有几个选择,因此可以为空的TINYINT数据类型会将其删除,并且您的答案行只有1个额外字节。如果这个额外的列恰好将列数增加到8的倍数,比如你从8到9或16到17,那么你需要为空位图的增长再支付一个额外的字节。但是最坏的情况是每行额外2个字节。