调查数据库设计

我需要创建一个调查,其中答案存储在数据库中。我只是想知道在数据库中实现这一点的最佳方式是什么,特别是所需的表。调查包含不同类型的问题。例如: 用于评论的文本字段、多项选择题,以及可能包含多个答案的问题(即检查所有应用程序)。

我想出了两种可能的解决方案:

  1. 创建一个巨大的表,其中包含 每个调查的答案 每一栏 对应的答案来自 统计调查,即「统计调查编号」、「统计调查问卷」, 答案2,答案3

    我觉得这不是最好的办法 因为有很多问题 在这个调查中,似乎并不是很 如果调查结果有所改变,可以采取灵活的方式

  2. 我想到的另一件事是 创建问题表和答案 表。问题表将 包含所有的问题 调查。答案表将包含 调查中的个人答案, 每一行都链接到一个问题。

    举个简单的例子:

    TblSurvey : SurveyID

    问题 : 问题 ID,调查身份证,问题类型,问题

    解答 : 解答 ID,用户名问题 ID,解答

    TblUser : UserID,UserName

    我的问题是 可能会有成千上万的答案 让答案表变得很大。 我不确定那是不是很棒 开始表演

如果你有什么建议和意见,我会很感激的。

140028 次浏览

对于一个简单的调查来说,看起来已经很完整了。不要忘记添加一个“开放价值”表,客户可以通过文本框提供他的意见。使用外键将该表链接到您的答案,并在所有关系列上放置索引以获得性能。

2号是对的。除非发现性能问题,否则应使用正确的设计。大多数 RDBMS 对于狭窄但非常长的表不会有问题。

2号看起来没问题。

对于一个只有4列的表来说,即使只有几百万行,也不会有什么问题。当然,这取决于您使用的数据库。如果是类似于 SQLServer 的东西,那么就没有问题。

您可能希望在 tblResponse 表中的 questions tionID 字段上创建一个索引。

当然,您需要指定正在使用的数据库以及估计的卷。

拥有一个大的答案表本身并不是一个问题。只要索引和约束定义良好,就没有问题。我觉得你的第二个模式不错。

给定适当的索引,你的第二个解决方案是规范化的,适合传统的关系数据库系统。

我不知道有多大,但它应该毫无问题地持有几百万个答案。

作为一般规则,基于用户可能更改的内容修改模式(例如向调查添加问题)应该被认为是相当糟糕的。在某些情况下,它可能是合适的,特别是在处理大量数据时,但是在开始之前要知道自己将要面对什么。每个调查只有一个“回答”表意味着添加或删除问题的成本可能非常高,而且很难以问题不可知的方式进行分析。

我认为你的第二种方法是最好的,但是如果你确定你会有很多规模方面的顾虑,有一件事情在过去对我来说是有效的,那就是混合方法:

  1. 创建详细的回答表来存储每个问题的回答,如2中所述。这些数据通常不会直接从应用程序中查询,而是用于为报表生成摘要数据。您可能还希望对这些数据实现某种形式的归档或删除。
  2. 如果需要,还可以从1创建响应表。当用户希望查看结果的简单表时,可以使用这种方法。
  3. 对于为报告目的需要进行的任何分析,安排作业根据1中的数据创建附加摘要数据。

这绝对需要更多的工作来实现,所以我真的不建议这样做,除非你确信这个表将会遇到大规模的问题。

当然是选项2,而且我认为您可能忽略了当前的模式,您可能需要另一个表:

+-----------+
| tblSurvey |
|-----------|
| SurveyId  |
+-----------+


+--------------+
| tblQuestion  |
|--------------|
| QuestionID   |
| SurveyID     |
| QuestionType |
| Question     |
+--------------+


+--------------+
| tblAnswer    |
|--------------|
| AnswerID     |
| QuestionID   |
| Answer       |
+--------------+


+------------------+
| tblUsersAnswer   |
|------------------|
| UserAnswerID     |
| AnswerID         |
| UserID           |
| Response         |
+------------------+


+-----------+
| tblUser   |
|-----------|
| UserID    |
| UserName  |
+-----------+

每个问题可能都有一组用户可以选择的答案,然后实际的答案将在另一个表中被跟踪。

数据库被设计用来存储大量数据,而且大多数数据库的伸缩性都很好。没有实际需要使用一个较小的 正常形态只是为了节省空间了。

第二种方法是最好的。

如果您想进一步规范化它,您可以为问题类型创建一个表

简单的做法是:

  • 将数据库和日志放在它们自己的磁盘上,而不是默认都放在 C 上
  • 根据需要创建尽可能大的数据库,以便在数据库增长时不会出现暂停

我们在 SQLServer 表中有数百万行的日志表。

我认为你的模型 # 2是好的,但是你可以看看更复杂的模型,它存储问题和预制的答案(提供的答案) ,并允许它们在不同的调查中重复使用。

- 一个调查可以有许多问题; 一个问题可以在许多调查中重复使用。
- 许多问题可以提供一个(预先制定的)答案。一个问题可以有很多答案。在不同的调查中,一个问题可以有不同的答案。在不同的调查中,不同的问题可以得到不同的答案。有一个默认的“其他”答案,如果一个人选择其他,她的答案被记录到答案。其他文字。
- 一个人可以参加多次调查,一个人只能在一次调查中回答具体问题一次。

survey_model_02

我的设计如下所示。

最新的创建脚本是在 https://gist.github.com/durrantm/1e618164fd4acf91e372

该脚本和 mysql workbench.mwb 文件也可以在
Https://github.com/durrantm/survey enter image description here

您可以选择将整个表单存储为 JSON 字符串。

不确定您的需求,但是这种方法在某些情况下可以工作。