设计DB结构

时间:2011-03-30 18:52:11

标签: sql schema-design

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

这是我对表结构的想法。

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

但我如何存储有关不同答案的信息?我可以在AnswerValue中写一些像“Carrot”(文本框),“1011”(复选框),“3”(radiobutton)等等。不幸的是,我认为这不是一个好的解决方案。在我的案例中,设计数据库结构的最佳方法是什么?

5 个答案:

答案 0 :(得分:1)

也许设计不是太糟糕......
由于你知道答案的QuestionId,你可以查询它是哪种类型的问题。

例如:

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

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

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

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

Items{
    ItemId
    QuestionId   
    Description
}

Answers_Items{
    ItemId
    AnswerId
    AnswerValue
}

答案 1 :(得分:1)

这是一个相当大的问题,所以我想我会回答我所解释的内容。在我看来,你正在寻找一种方法,根据答案的类型,确定要显示什么样的控件。我使用了两种模式并取得了一些成功。一个涉及存储我通常可以映射到.Net类型的AnswerType。然后,根据该类型,确定要显示哪种控件(即字符串 - > TextBox,bool - > radiobutton,multiselect / array - >复选框列表等)。另一个涉及存储元数据(很像你上面描述的那样)。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您的结构可以存储用户针对单个问题的多个答案。但是,您可能需要添加日期时间字段,以便在知道特定答案时 时(相对于同一问题的其他答案)。

答案 4 :(得分:1)

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