管理固定值和用户定义的值

问题描述 投票:0回答:1

我正在为一个应用程序设计数据库,在该应用程序中向用户提出问题,他必须回答这些问题。无论是作为调查问卷还是作为问答游戏,这个概念都适用于两者。我计划:

  • 有问题的表格
  • 一个包含可能答案的表格,每个表格都与一个外键链接到它所属的问题(让我们保持简单并假设它是1:多关系,其中答案不能在问题之间共享)
  • 一个包含用户提供的答案的表(包含问题的外键,答案和用户ID)

由于许多问题都是常见的情况,例如是/否,我决定为每个问题指定一个“问题类型”枚举。例如,如果应用程序看到是/否问题,则表示数据库中没有答案,应用程序将自动添加两个答案,“是”和“否”。这在答案表中节省了数百或数千个无用的行。

但是,我不确定如何定义表来记录用户的答案。如果没有特殊类型的问题,我只会记录问题ID,答案ID和用户ID,这意味着“用户X回答Y问题Z”。但是,“是/否”问题在表格中没有匹配的答案,因此我无法使用答案ID。

即使在问题之间分享答案(通过在问题和答案之间建立多对多关系)也不是一个好的解决方案。当然,它允许我将“是”和“否”定义为常规答案,但是应用程序应该知道“是/否”问题使用答案(比如说)7和8 - 或者,当创建“是/否”时没有“问题答案7和8应该受到这个问题的约束。但这意味着这些“特殊”答案的ID必须在其他地方硬编码。此外,如果我将来添加更多特殊类型的问题,这将无法很好地扩展。

我该怎么办?理想情况下,我需要在“用户答案”表的每一行中存储固定值或答案表的外键。有没有比使用两列更好的解决方案,其中一列是NULL?

我正在使用SQL Server,如果这很重要的话。

sql-server database
1个回答
1
投票

根据您的描述,我想我会继续在表格中添加另一列并使FK列可以为空。

对于那些特殊问题,您可能只有几个选择,因此可以为空的TINYINT数据类型会将其删除,并且您的答案行只需要1个额外字节。如果这个额外的列恰好将列数增加到8的倍数,比如你从8到9或16到17,那么你需要为空位图的增长再支付一个额外的字节。但最坏的情况是每行2个额外字节。

© www.soinside.com 2019 - 2024. All rights reserved.