我正在尝试找到创建调查应用程序的最佳解决方案,该应用程序允许用户在管理员部分中选择他们的问题。
如果我有一个提出问题的前端网页,当他们回答问题时,我会将答案保存在数据库中。现在,如果我的“FinishedSurvey”表中的列与问题匹配,那么这很好。但是,我想要的是能够让用户选择他们的问题,这样当他们登录时,他们会看到他们的问题,在提交时,这些答案会与这些问题一起保存,以便将来检索。
此问题会移至任何需要允许人们在您不知情的情况下更改数据库中存储内容的应用程序。
我过去曾经做过类似的事情,我说过20个int列和20个varchar列,这些列具有通用名称,配置文件映射到特定的客户配置。假设varCharColumn1映射到“你叫什么名字?”。然而,这是混乱的,不是真正可扩展,并且浪费存储。
此应用程序将拥有数千名用户,他们都会使用不同的输入方法和不同格式的答案来提出不同的问题。有些人可能需要设置答案,日历,包含10个字符的自由文本,包含1000个字符的自由文本和数字。
可能有一个简单的答案或方法,或者甚至是一个我并不熟悉的技术,但是我无法想到一个简单的方法。
此特定应用程序是带有MsSQL数据库的ASP.NET 4.0网站。
答案 0 :(得分:3)
你是对的。拿起一本关于数据库规范化的书。如果有人想要一百个问题的调查怎么办?你会说“我们不能”,或者你会推出一个创建一百列的更新吗?列[...]匹配问题[...] 20个int列和20个varchar列[...]但是这很麻烦,不能真正扩展,并且浪费存储空间。
我想我会这样做:说你在顶级有一张问卷调查表:
ID | Description
-------------------------
1 | 'Test questionnaire'
创建一个由问题组成的表格,例如:
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表中添加类型列(比如VarCharValue
,DateTimeValue
,IntValue
...)。然后,您必须在Answers表中注册可以为答案输入什么类型的值并填写/读取相应的列。不过,那个设计仍然有气味。