什么样的mysql数据库表和关系支持Q&;有条件问题的调查?

什么样的mysql数据库表和关系支持Q&;有条件问题的调查?,sql,database-design,database-schema,erd,data-modeling,Sql,Database Design,Database Schema,Erd,Data Modeling,我现在正在做一个相当简单的调查系统。数据库模式将很简单:一个调查表,与问题表呈一对多关系,与答案表和可能答案表呈一对多关系 最近,该客户意识到,她希望能够仅向对之前某个问题给出一个特定答案的人展示某些问题(例如,你买香烟吗?之后会是你最喜欢的香烟品牌是什么?向非吸烟者提问第二个问题毫无意义) 现在我开始想,在我的数据库模式中,实现这个条件问题的最佳方式是什么?如果问题A有两个可能的答案:A和B,并且问题B应该只出现在用户面前如果答案是A 编辑:我要寻找的是一种将这些需求信息存储在数据库中的方法。

我现在正在做一个相当简单的调查系统。数据库模式将很简单:一个
调查
表,与
问题
表呈一对多关系,与
答案
表和
可能答案
表呈一对多关系

最近,该客户意识到,她希望能够仅向对之前某个问题给出一个特定答案的人展示某些问题(例如,你买香烟吗?之后会是你最喜欢的香烟品牌是什么?向非吸烟者提问第二个问题毫无意义)

现在我开始想,在我的数据库模式中,实现这个条件问题的最佳方式是什么?如果
问题A
有两个可能的答案:A和B,并且
问题B
应该只出现在用户面前如果答案是
A


编辑:我要寻找的是一种将这些需求信息存储在数据库中的方法。数据处理可能会在应用程序端完成,因为我的SQL技能很差;)

一种方法是添加带有字段的表“问题要求”:

  • 问题编号(链接到“哪个品牌?”问题)
  • 必需的问题id(链接到“你吸烟吗?”问题)
  • 所需答案id(链接到“是”答案)
在应用程序中,在提出特定问题之前,请检查此表。
使用单独的表,添加所需答案很容易(为“有时”答案添加另一行等)。

就我个人而言,在这种情况下,我将使用您描述的结构,并将数据库用作哑存储机制。我非常喜欢将这些复杂且相互依赖的约束放入应用程序层

我认为,在不使用外键为每个问题构建新表的情况下实施这些约束的唯一方法是使用T-SQL工具或其他特定于供应商的机制来构建数据库触发器来实施这些约束

在应用程序级别上,您可以获得更多的可能性,并且更易于移植,因此我更喜欢这种选择


我希望这将有助于您为应用程序找到策略。

您也可以考虑复杂的规则,在问题表中有一个基于字符串的条件字段,接受/解析以下任何一项:

  • A(1)=3
  • ((A(1)=3)和(A(2)=4))
  • A(3)>2
  • (A(3)=1)和(A(17)!=2)以及C(1)
其中A(x)=y表示“问题x的答案为y”,C(x)表示问题x的条件(默认为真)

这些问题有一个顺序字段,你可以一个接一个地检查它们,跳过条件为FALSE的问题

这应该允许对您想要的任何复杂度进行调查,您的GUI可以在“简单模式”下自动创建这些调查,并允许用户直接输入方程式的“高级模式”和“高级模式”

测量数据库设计 最后更新:2015年5月3日
图表和SQL文件现在可在

如果您使用此(顶部)答案或任何元素,请添加改进反馈

这是一部真正的经典作品,由数千人完成。一开始,它们看起来总是“相当简单”,但说句好的话,它实际上相当复杂。要在Rails中实现这一点,我将使用附图中所示的模型。我敢肯定,对于某些人来说,这似乎过于复杂了,但一旦您构建了其中一些,经过多年,您就会意识到大多数设计决策都是非常经典的模式,最好从一开始就通过动态灵活的数据结构来解决。
详情如下:

关键表的表详细信息 答案 答案表格非常关键,因为它捕获了用户的实际响应。 您会注意到答案链接到问题选项,而不是问题。这是故意的

输入类型 输入类型是问题的类型。每个问题只能是一种类型,例如所有无线电拨号、所有文本字段等。如果有(比如)5个无线电拨号和1个“包括?”选项复选框或某些此类组合,请使用附加问题。将用户视图中的两个问题标记为一个问题,但内部有两个问题,一个用于无线电拨号,一个用于复选框。在这种情况下,复选框的组为1

选项组 选项组选项组允许您构建“普通”组。 例如,在一个房地产应用程序中,可能会有一个问题“该房产有多旧?”。 答案可能在以下范围内: 1-5 6-10 10-25 25-100 一百+

然后,例如,如果存在关于相邻物业年限的问题,则调查将希望“重用”上述范围,以便使用相同的选项组和选项

度量单位 度量单位是听起来的。不管是英寸、杯子、像素、砖块还是别的什么,你都可以在这里定义一下


仅供参考:虽然本质上是通用的,但可以在此基础上创建一个应用程序,并且此模式非常适合RubyonRails框架,具有诸如每个表的主键的“id”之类的约定。此外,这些关系都是简单的一对多关系,没有多对多关系,或者需要多通。我可能会添加has\u many:throughs和/或:delegates,以便在没有.multiple.chaining的情况下轻松地从单个答案中获取调查名称。

我的选项总共只需要一个表,而不是每个问题都需要新表是的,我计划将逻辑应用到应用程序中,我不太喜欢为每一点逻辑创建存储过程(主要是因为我很烂)。我只是在寻找一种存储需求的好方法。tehvan,我认为对于更复杂的需求,解决方案确实缺少一些关键