存储动态问卷的有效方式?

时间:2011-02-11 03:25:38

标签: sql-server database-design .net-4.0 dynamic-data

关于this问题,我面临着几乎相同的情况,除了在我的情况下,问题可能是静态的(它可能会不时变化,我仍然认为这不是一个好主意为每个问题添加列,但即使我决定添加,如何指定/检索答案,但答案是不同的类型,例如答案可能是是/否,列表项,自由文本,列表-items或自由文本(其他,请注明),多项选择列表项等。

实现这一目标的有效方法是什么?

2 个答案:

答案 0 :(得分:3)

Shimmy,我写了一篇解决这个问题的四篇文章 - 见Creating a Dynamic, Data-Drive User Interface。本文着眼于如何让用户定义要存储的关于客户端的数据,因此这不是对您的问题的准确检查,但它非常接近。也就是说,我的文章展示了如何让最终用户定义要存储的数据类型,这与您想要的一致。

以下ER图给出了数据模型的要点:

Data model

此处,DynamicAttributesForClients是表示用户想要为其客户端跟踪的用户创建的属性的表。简而言之,每个属性都有一个DataTypeId值,表示它是布尔属性,文本属性,数字属性等等。在您的情况下,此表将存储调查问题。

DynamicValuesForClients表包含为特定属性存储的特定客户端的值。在您的情况下,此表将存储调查问题的答案。实际值存储在DynamicValue列中,类型为sql_variant,允许将任何类型的数据(数字,位,字符串等)存储在那里。

我的文章没有解决如何处理多项选择题,用户可以从预设的选项列表中选择一个选项,但增强数据模型以允许这一点非常简单。您将使用以下列创建名为DynamicListOptions的新表:

  • DynamicListOptionId - 主键
  • DynamicAttributeId - 指定与这些问题相关联的属性
  • OptionText - 选项文字

因此,如果您有一个多项选择属性,则可以使用查询返回的选项填充用户界面中的下拉列表:

SELECT OptionText
FROM DynamicListOptions
WHERE DynamicAttributeId = ...

最后,您可以将选定的DynamicListOptionId值存储在DynamicValuesForClients.DynamicValue列中,以记录他们选择的列表选项(如果他们没有选择项目,则使用NULL

仔细阅读文章。您可以下载完整的工作演示,其中包括完整的数据库及其模型。此外,构成该系列的四篇文章深入探讨了数据模型,并展示了如何构建基于Web的(ASP.NET)用户界面,以便让用户定义动态属性,如何显示它们以进行数据输入等等。

快乐编程!

答案 1 :(得分:2)

Survey ERD

这可能不适合你,但这就是我的兼职工作。

我有问题表,答案表和调查表。对于每个新的调查,我都会建立一个调查版本(因为每个调查都是独一无二的,但问题和答案会重复很多)。然后,我有一个响应者表,其中包含有关受访者的一些信息(它还链接回调查表,忘记了图中)。我还有一个响应表,链接响应者和调查版本。这可能不是最好的方式,但它是适用于我的方式,并且它的工作速度非常快(我们在响应表中大约为1mill +,它像梦一样处理。)

通过这个模型,我得到了可重复使用的问题,可重复使用的答案(我们的许多问题使用“是”和“否”),以及相当苗条的答案表。