2011-03-30 127 views
0

我想用测试创建网站。测试包含不同的问题。它可以是文本框,复选框或单选按钮。我想存储分贝的问题,答案和用户。设计数据库结构

这是我对表格结构的想法。

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

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

+0

我读过你的问题3次,仍然不明白。 – JohnOpincar 2011-03-30 18:56:50

+0

@JohnOpincar对不起,我不是母语的人:)。你能再问一些问题吗? – Neir0 2011-03-30 19:05:41

+0

@JohnOpincar我认为他是询问如何德兴分贝,因为不同的答案需要不同的列类型。 – mcabral 2011-03-30 19:08:43

回答

1

也许设计也不错...
既然你知道答案的QuestionId,你可以查询它是哪种类型的问题。

例如:

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

然后在你的代码,当你显示的答案,你有两个答案的价值和它的类型,所以你的代码可以处理基于Q.Type。

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

例如,一个复选框问题可以有很多项目(检查-能的东西),以及一个复选框答案可以有很多的项目(这些检查的项目)。在你目前的架构中,似乎没有任何方法可以存储每个项目的描述。所以,我建议一个新的表项和Answers_Items

Items{ 
    ItemId 
    QuestionId 
    Description 
} 

Answers_Items{ 
    ItemId 
    AnswerId 
    AnswerValue 
} 
+0

是的,我可以查询问题类型,但它是否好存储回答为01010? – Neir0 2011-03-30 19:07:31

+0

@ Neir0,考虑与上面新模式的一对多关系。 – skabbes 2011-03-30 20:02:49

1

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

就你而言,我会探索前一种解决方案,因为它通常更容易实现,并且需要更少的元数据预知和编程。一组答案类型的例子可能包括:字符串,是/否,数字,列表。正如你所看到的,这些一般类型很容易映射到.Net类型。在“列表”的情况下,您可能需要为查找(或AllowedValues)添加额外的表。

我希望这是你在找什么。否则,我可能会建议寻找类似的开源系统。 This搜索可能是一个好的开始。

1

你可能只是想为每个类型的答案一个单独的值更多的扩展你的答案表: TextAnswer RadioAnswer(将是一个索引到选定的单选按钮)检查值 CheckboxAnswer(恐惧位图)

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

1

你的结构细存储用户的多个答案的一个问题。但是,您可能想添加一个日期时间字段,所以你知道时指定一个特定的答案(相对于其他的答案了同样的问题)。

1

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