在数据库中存储多项选择调查答案的最佳方式

Sam*_*aby 8 mysql sql database

我目前正在使用PHP/MySQL开发调查创建/管理Web应用程序.我已经经历了数据库表的几个修订,我再次发现我可能需要重新考虑某种类型的答案的存储.

现在,我有一个看起来像这样的表:

survey_answers

id          PK
eid
sesid
intvalue    Nullable
charvalue   Nullable
Run Code Online (Sandbox Code Playgroud)

id =分配给每一行的唯一值

eid =此答案的回答调查问题

sesid =调查"会话"(有关调查时间和日期的信息)id

intvalue =如果是数值,则为答案的值

charvalue =答案的值,如果它是文本表示

这使我能够继续使用MySQL的数学函数来加速处理.

然而,我发现了一个新的挑战:存储具有多个响应的问题.一个例子是:

您喜欢吃以下哪种食物?(选择所有申请)

  • 女童子军饼干
  • 培根
  • 玉米
  • 鲸鱼脂肪

现在,当我想存储结果时,我不确定处理它的最佳方法.目前,我有一个表只是为了多选项,看起来像这样:

survey_element_options

id        PK
eid
value
Run Code Online (Sandbox Code Playgroud)

id =与每行关联的唯一值

eid =与此选项关联的问题/元素

value =该选项的文本值

通过此设置,我将返回的多个选择答案存储在'survey_answers'中,作为在调查中选择的element_options行的逗号分隔id的字符串.(即类似"4,6,7,9")我想如果这确实是最好的解决方案,或者如果它是更实际的创建新表,将持有每个答案选择,然后引用回给定的答案行反过来引用回到元素并最终引用调查.


编辑

对于任何感兴趣的人,这是我最终采取的方法(在PhpMyAdmin关系视图中):

数据库关系和表结构

收集多选问题的计数的基本查询如下所示:

SELECT e.question AS question, eo.value AS value, COUNT(eo.value) AS count
FROM survey_elements e, survey_element_options eo, survey_answer_options ao
WHERE e.id = 19
AND eo.eid = e.id
AND ao.oid = eo.id
GROUP BY eo.value
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 5

这确实取决于很多事情。

  1. 通常,在数据库中存储用逗号分隔的值的列表是很不好的,尤其是如果您打算对该数据进行远程智能处理。特别是如果您想对答案进行任何高级报告。
  2. 最佳存储这种关系的办法就是也定义在第二个表的答案,然后将它们在第三个表链接到用户回答记者提问(每用户问题的多个条目,或者如果可能的用户勘测问题用户可以对同一问题进行多项调查。

作为一个简单的示例,这可能会变得稍微复杂一些:

表格示例:

  • UsersUsernameUserID
  • QuestionsqIDQuestionsText
  • AnswersAnswerText[在这种情况下,示例可能是可重用的,但这也确实造成了额外的复杂性],aID
  • Question_Answers([此问题可用的答案,每个问题的多个条目] qaIDqIDaID),
  • UserQuestionAnswersqaIDuID

注意:此举仅供参考,并非建议