如何构建一个 Sql Server 表来存储与 QuestionId 配对的测验答案?

JoJ*_*oJo 1 sql database-design entity-relationship relational-database

我有一个 .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]
Run Code Online (Sandbox Code Playgroud)

use*_*674 5

不要存储非规范化数据——这将使以后的生活变得痛苦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)
Run Code Online (Sandbox Code Playgroud)

使用上述方法允许我运行如下查询:

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

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


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