0

我想创建带有测试的网站。测试包含不同的问题。它可以是文本框、复选框或单选按钮。我想将问题、答案和用户存储在数据库中。

这是我对表结构的想法。

Users
{
   Id
   Name
}
Questions
{
   Id
   Description
   Type // textbox, checkbox, etc
}
Answers
{ 
    Id
    UserId
    QuestionId
    AnswerValue
}

但是我如何存储有关不同答案的信息?我可以在 AnswerValue 中写入类似“Carrot”(文本框)、“1011”(复选框)、“3”(单选按钮)等内容。不幸的是,我认为这不是一个好的解决方案。在我的情况下设计数据库结构的最佳方法是什么?

4

5 回答 5

1

也许设计还不错……
因为您知道答案的 QuestionId,您可以查找它是哪种类型的问题。

例如:

SELECT 
   Q.Type, A.* FROM Question Q, Answer A
WHERE
   Q.Id = A.QuestionId

然后在您的代码中,当您显示答案时,您将拥有答案值及其类型,因此您的代码可以基于 Q.Type 进行处理。

要解决如何存储具有多个值(复选框或单选按钮)的问题的答案的问题,您应该考虑将它们存储在另一个具有一对多关系的表中。

例如,一个 Checkbox 问题可以有许多 Item(可检查的事物),而 Checkbox答案可以有许多 Item(被选中的项目)。在您当前的架构中,似乎没有任何方法可以存储每个项目的描述。所以,我建议一个新表 Items 和 Answers_Items

Items{
    ItemId
    QuestionId   
    Description
}

Answers_Items{
    ItemId
    AnswerId
    AnswerValue
}
于 2011-03-30T19:01:13.403 回答
1

这是一个相当大的问题,所以我想我会回答我所解释的核心问题。在我看来,您正在寻找一种方法来根据答案类型确定要显示的控件类型。我在这方面使用了两种模式并取得了一些成功。一个涉及存储我通常可以映射到 .Net 类型的 AnswerType。然后,根据该类型,确定要显示的控件类型(即字符串 -> 文本框、布尔值 -> 单选按钮、多选/数组 -> 复选框列表等)。另一个涉及存储元数据(很像你上面描述的)。

在您的情况下,我将探索前一种解决方案,因为它通常“更容易”实现,并且需要较少的预知和围绕元数据进行编程。一组答案类型的示例可能包括:字符串、是/否、数字、列表。如您所见,这些通用类型很容易映射到 .Net 类型。在“列表”的情况下,您可能需要添加一个附加表以进行查找(或 AllowedValues)。

我希望这就是你要找的。否则,我可能会建议研究类似的开源系统。 这种搜索可能是一个好的开始。

于 2011-03-30T19:05:02.467 回答
1

您可能只想为每种类型的答案使用单独的值进一步扩展您的 Answers 表:TextAnswer RadioAnswer(将是所选单选按钮的索引) CheckboxAnswer(检查值的可怕位图)

这种方法的问题在于,它们每个都必须可以为空,以便允许另一种类型的值作为给定问题的答案……如果您希望数据库强制执行它,这会使数据完整性变得更加复杂。

于 2011-03-30T19:18:00.340 回答
1

您的结构可以很好地存储用户对单个问题的多个答案。但是,您可能希望添加一个日期时间字段,以便知道何时给出特定答案(相对于同一问题的其他答案)。

于 2011-03-30T19:27:59.230 回答
1

我发现使用 string/varchar(对二进制数据使用 base64 编码)是最简单的解决方案,并且我已经尝试/看到了生产环境中的所有变体。我特别不喜欢有多个列,每个数据类型一个。这对 A$$ 来说是一个真正的痛苦。

于 2011-03-30T20:22:55.907 回答