问卷数据库设计——哪种方式更好?

Mod*_*lar 15 database-design

我有一个很长的 html 页面,几组问题分为小部分(一页大约有 15 个子部分),问题总数约为 100 个问题:从输入、多选、复选框、单选按钮、文本区域、和文件上传。一个问题可以包含许多答案,这些答案可以从一组复选框、一组选择列表、一组多选或所有这些组合成一个答案中获得。我以为我会在下面使用这个数据库设计,但最近发现这毕竟不是一个好方法。

  1. 一个客户只能有一组问题:每 100 个问题就有一个客户。
  2. 对于旧方法,我不会在数据库中保留问题,而是在 PHP 编码中指定为常量。问题是我必须比较 PHP 中的问题才能使其与数据库中的答案同步。如果某个问题已从 PHP 中更改/删除/移动,我肯定会迷失在将其与问卷数据库中的答案匹配的情况下。更好的解决方案?
  3. 我能否将从表单中的多个元素获得的多个答案保存在一个字段中作为一个答案?如何检索此字段并再次显示以供客户在表单上查看?
  4. 我应该选择下面的哪个选项?

选项 1:旧方法(1 桌)

表格:问卷

  • 身份证(PK)
  • 顾客ID
  • 地位
  • A1
  • A2
  • A3
  • .
  • .
  • .
  • A100

选项 2:新方法(2 个表)

表格:问题

  • QID(PK)
  • 问题(varchar)

表:答案

  • 援助(PK)
  • 顾客ID
  • QID(整数)
  • 答案(varchar)

还是选项3?

Oli*_*bes 18

绝对不要硬编码你的问卷。使用关系数据库或 xml 文件。我提出以下表格

  • Questionnaire: 问卷的一般描述。标题、调查名称、问卷发布日期、版本等。

  • Section:由问卷组成的部分。章节编号、章节标题、描述。

  • Question: 属于一个部分的问题。问题编号、问题文本、描述、问题类型(文本、多项选择等)。

  • Question_Choice:属于与单个复选框、单选按钮等对应的问题的可能答案。选择文本、选择编号、顺序。

  • Respondent: 回答问题的人。个人资料、用户编号。

  • Interview:属于一名受访者和一份问卷的访谈或测试或调查(取决于问卷的性质)。如果受访者始终只能回答一份问卷(或者如果调查是匿名的),则此表已过时并可与受访者表合并。面试日期(或测试日期或调查日期)、面试官(如果适用)。

  • Answer:属于一次访谈(或受访者,见上文)和一个问题的答案。回答文本(对于文本类型的问题),选择(对于单选按钮)。

  • Answer_Choice:当可以勾选多个选项时,选项属于一个答案和一个 Question_Choice。

这是一种非常规范的方法;但是,您可以决定将选项连接到一个字符串中,或​​者将它们存储为位模式,或者根据您的需要以其他方式简化它。


小智 6

你需要几张桌子,

1 - 问题(问题 id、输入类型、可见、问题类型、问题文本、预期答案....)

2 - 答案(问题 ID、用户 ID、活动 ID、答案....)

3 - 用户(用户ID,用户名......)

4 - 保存问答活动的表格(活动 id、数据/时间、用户 id)

您可能还希望有一个表格,用于指定应应用于每个活动的问题 - 按用户分组或问题集合。外键/主键将是多个表中具有相同名称的列,并且应该被索引。

如果您使用此结构,您应该能够添加问题或用户或更改答案,而无需更改架构或演示代码 - 确保演示代码是在运行时动态创建的 - 您只需要添加一条记录在适当的地方。

这种方法最初的开发时间可能比硬编码方法要长,但维护起来要简单得多,因为您只需要更改数据即可更改行为。

(提示,要创建您的表示层,您需要一个查询来获取要显示的适当问题,然后遍历此结果集并调用一个方法在屏幕上呈现问题,选择的方法适合于该问题的介绍 [文本框、广播组等])