【问题标题】:Simple survey database design简单的调查数据库设计
【发布时间】:2012-07-11 23:05:10
【问题描述】:

我正在为我的活动的访客创建一项调查。 但是,自从我创建数据库以来已经有一段时间了。所以我需要一些帮助。

我找到了一些解决方案,但它们的范围很广,我不需要。

访问者需要保持匿名,但他们可以留下他们的电子邮件(单独的表格电子邮件,未链接到任何 atm)。 他们有大约 20 个问题,有些是开放的,有些是一个选项(单选),有些是多个选项(复选框)。 这些问题需要可重复使用。 就是这样。 我只是不知道如何超越您在下图中看到的多对多。

我该怎么走? Answers 表需要与? Surveys_have_Questions,还是有问题?

编辑:

正如以下链接中的答案所述,大多数调查都基于经典设计模式。我的就是其中一项调查。更多信息在下面的链接中: What mysql database tables and relationships would support a Q&A survey with conditional questions?

【问题讨论】:

  • 这可能更适合programmers.stackexchange.com
  • 为什么?我在stackoverflow上遇到了关于数据库设计的各种主题。也许是 DatabaseAdministrators。
  • 您的问题没有具体内容。基本上是——“这是我的要求,告诉我答案”。您还根据您的用例和需求定制了问题,在此过程中,在同一领域工作的其他开发人员不会普遍感兴趣的答案。出于这两个原因,我相信您不属于 stackoverflow 指南。您应该能够通过添加一个受访者实体(它应该替换您的“电子邮件”实体)来完成您的模型。受访者应该有一个可以为空的电子邮件地址属性。使用表格将受访者链接到调查。
  • 假设您将该表称为 SurveyRespondent,则为该表提供它自己的 PK。然后创建一个表 SurveyRespondentAnswer,该表链接到每个给出的答案的 Surveys_have_Questions。添加记录答案所需的内容。您暗示了问题的“元”设计,可以让您描述问题的可能响应......但您可以看到这已经不是一个“简单”的设计。我建议改用 MongoDB,因为创建允许问题变化的“问题”集合要容易得多。
  • @gview,由于工作量大,我有点压力。所以我确实发布了这个想法,也许他们会为我提供一些答案。但是因为 ctrahey 基本上说我应该尝试和考虑我之前遇到的设计,所以我冷静下来并再次检查它,whatadayakno' 它起作用了。我只需要更好、更冷静地复习它。

标签: mysql database-design survey


【解决方案1】:

我可能会为用户进行调查的事件建模,可能是一个名为“User_Answer_Session”的表,其中包含指向调查和用户的链接;然后是“User_Answers”,它们与会话和问题相关联,并包含答案的实际 blob。 究竟我如何模拟答案将取决于几件事(主要是我希望能够查找它们的稳健程度)。例如,我是否希望能够索引多项选择答案以实现极速报告?如果是这样,那么您需要为此建模。这可能包括创建一个“Question_Options”表,该表是问题和可用选项之间的一对多...

这应该让您沿着一条好的道路思考。 :-)

【讨论】:

  • 好吧,我猜你正朝着这个方向前进:stackoverflow.com/questions/540885/… 这是我已经尝试过的东西,但关系不可能是正确的,可以吗?此外,我不需要存储或知道回答问题的人的任何信息,除了他们的年龄、性别、他们参观活动的时间等,但这些问题不需要与用户或类似的东西相关联那个。
  • 你反对这种模式吗?关系可能开始看起来很复杂,但从长远来看,规范化的数据库(充满关系)将为您提供更好的服务。如果您对像这样看似复杂的模式不满意,请阅读一些关于规范化的内容......我实际上已经对过于简单的模式感到不舒服,它们总是在未来的某个时候抬起头来;而且解决方案通常很痛苦。
  • 我真的不知道那个设计更好并且允许更大的灵活性,但我有点着急,我的活动是这个周末,我想准备一个数据库到明天 :x 我也有纸质调查,但我希望访客在线填写调查。我已经从我在评论中发布的链接创建了数据库,但我不太熟悉多对多关系以及如何处理数据的插入。
  • 信不信由你,我明白了。它真的没有那么复杂,我只需要更好,更冷静地研究设计:)。现在我可以将数据库设计实施到我的在线调查中,并且很可能能够让访问者使用唯一的调查而没有任何问题。
【解决方案2】:

我看不出你需要所有这些表的原因!我认为它可以比这简单得多。

调查

desc VarChar
startDate timestamp
endDate timestamp
isOpen boolean

survery_questions

survery_id int (FK)
question Text
vote_count unsigned INT 

用户调查

user_id
survery_id 
unique key (user_id_survery_id) #to ensure no duplicate votes

就是这样:)。 当用户投票运行时

insert into user_survery (user_id,survery_id) VALUES (1,1);
update survery_questions set vote_count = vote_count+1;

当你需要得到调查结果时

select * from survery_questions where survery_id = X;

等等

【讨论】:

  • 哇,三年后。努力奋斗 :) 与此同时,我继续前进并学到了很多东西。不过还是谢谢。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 2021-04-05
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2017-12-27
  • 2012-10-08
相关资源
最近更新 更多