0

我正在尝试找到创建调查应用程序的最佳解决方案,该应用程序允许用户在管理员部分中选择他们的问题。

如果我有一个提出问题的前端网页,当他们回答问题时,我会将答案保存在数据库中。现在,如果我的“FinishedSurvey”表中的列与问题匹配,那就太好了。但是,我想要的是能够允许用户选择他们的问题,这样当他们登录时,他们会看到他们的问题,并且在提交时,这些答案会与这些问题一起保存以供将来检索。

这个问题涉及到任何应用程序,在这些应用程序中,您需要允许人们在您不知情的情况下更改数据库中存储的内容。

过去我做过这样的事情,我说过 20 个 int 列和 20 个 varchar 列具有通用名称,配置文件映射到特定的客户配置。假设 varCharColumn1 映射到“你叫什么名字?”。然而,这很混乱,不是真正可扩展的,而且浪费了存储空间。

这个应用程序将有成千上万的用户,他们都会用不同的输入方法和不同的答案格式提出不同的问题。有些可能需要带有固定答案、日历、10 个字符的自由文本、1000 个字符的自由文本和数字的下拉菜单。

可能有一个简单的答案或方法,甚至是我不熟悉的技术来做到这一点,但是我真的想不出一个简单的方法。

这个特定的应用程序是一个带有 MsSQL 数据库的 ASP.NET 4.0 网站。

4

1 回答 1

3

列 [...] 匹配问题 [...] 20 个 int 列和 20 个 varchar 列 [...] 但是这很混乱,不能真正扩展,并且浪费存储空间。

你是对的。拿起一本关于数据库规范化的书。如果有人想要一份有一百个问题的调查怎么办?你会说“我们不能”,还是会推出一个创建一百列的更新?

我想我会这样做:假设您在顶层有一个问卷表:

ID | Description
-------------------------
 1 | 'Test questionnaire'

创建一个由 Questions 组成的表,例如:

ID | QuestionnaireID | Question        | ( Other options like 'IsMandatory')
----------------------------------------------------------------------------
 1 |               1 | 'Test question' | 

然后创建一个 Answers 表:

ID | QuestionID | Answer          | IsUserSpecified
---------------------------------------------------
 1 |          1 | 'Test answer 1' |               0 
 2 |          1 | 'Test answer 2' |               0
 3 |          1 | 'Other...'      |               1

然后创建一个包含已回答问题的响应表:

ID | UserID | AnswerID | AnswerValue
----------------------------------------------------------------------------
 1 |      1 |        1 | 
 1 |      2 |        3 | 'I was entered by the user'

你完成了。您可以让用户输入一个 AnswerValue,就像他们可以输入自己的值一样,例如“Other...”答案。

不幸的是,这不涉及给定答案的类型。我认为,但我没有时间思考和/或测试它,您可以将类型列添加到 Answers 和 Response 表(如VarCharValueDateTimeValueIntValue...)。然后,您必须在 Answers 表中注册可以为答案输入什么类型的值并填写/读取相应的列。不过,那个设计仍然有味道。

于 2012-10-23T13:21:42.603 回答