1

我有一个 .aspx 表格,在调查中总共有大约 50 个多项选择题。

我应该建立一个问题ID和给出的答案的分隔字符串并只存储一个字符串吗?问题在于字符串可能很长,因此需要数据类型文本?

这将允许所有答案都在 1 条记录中。

或者,我正在考虑这样的事情,其中​​每个答案都是它自己的记录,并且每个提交的调查都需要由唯一标识符加入。

什么是正确的方法,甚至是我没有想到的方法?

我有一个 .aspx 表格,在调查中总共有大约 50 个多项选择题。

我应该建立一个问题ID和给出的答案的分隔字符串并只存储一个字符串吗?问题在于字符串可能很长,因此需要数据类型文本?

这将允许所有答案都在 1 条记录中。

或者,我正在考虑这样的事情,其中​​每个答案都是它自己的记录,并且每个提交的调查都需要由唯一标识符加入。

什么是正确的方法,甚至是我没有想到的方法?

CREATE TABLE [dbo].[surveyAnswers](
[id] [int] IDENTITY(1,1) NOT NULL,
[questionId] [int] NOT NULL,
[quizId] [uniqueidentifier] NOT NULL,
[answerValue] [varchar](50) NULL,
[quizDate] [datetime] NOT NULL) ON [PRIMARY]
4

1 回答 1

4

不要存储非规范化的数据——这将使以后的生活变得痛苦1 . 好的,现在我们可以跳过第一种方法了.. :)

底部的方法看起来“像一个开始”,但有几个问题。首先,quizDate 没有业务(它与测验有关,而不是答案),其次,模式没有捕捉到谁实际参加了测验。

我的模型(在我捕获标准分组、多个部署、维度、方面和多值时显示为简化形式,这对于简单的案例来说是多余的)看起来类似于以下内容:

-- Survey/Quiz "has many Questions"
Survey (SurveyStartedAt, SurveyExpiresAt)
-- Question "belongs to a Survey"
Question (FK Survey, QuestionPrompt, QuestionRules..)
-- Each Participant can "respond to a Survey"
Response (FK Participant, FK Survey, ResponseTime)
-- And each Answer, of which there are many per Response,
-- "contains the answer for a single Question"
Answer (FK Response, FK Question, Value)

使用上述方法可以让我运行如下查询:

  1. 谁参加(或没有参加)测验?什么时候?多少次?
  2. “李克特”问题的平均评分是多少?
  3. 哪些可选问题没有得到回答?
  4. (还有更多,包括高级汇总;SQL Server 非常强大。)

请注意,我避开了一些安全和规范化(as Answer->Question, but Response->Survey->Question),因此架构不会阻止无效Answer(Response, Question)对。虽然这可以通过将调查输入到答案关系中来解决(也许更好的是,添加一个SurveyQuestions关系),但我通过强加一个不可变的设计和一个看门人来处理这个问题:一旦测验开始调查(以及所有相关的问题) 永远不能改变。


1虽然使用基于“性能”的每测验一个记录结果来“避免创建过多行”可能很诱人 - 不要;这里没有性能问题!答案记录非常小(可以在页面上很好地压缩),并且在正确索引时,检索和运行查询非常快。在这种分解导致“太多”记录(超过数百万)的地方,可以考虑其他方法 - 但不要从非规范化关系模式开始

于 2013-09-09T21:39:09.147 回答