【问题标题】:Table design for questionaire问卷表设计
【发布时间】:2015-09-04 11:48:27
【问题描述】:

我们正在开发一个应用程序,它会向用户提出各种问题,这些问题可以有分支,因此它们不会按顺序运行。例如,如果以下是问题的结构以及它们可以流向的位置:

如果用户回答“是”,则问题 2 有一个分支,我们移至 3 并在 7 处结束,否则我们将继续向下 4、5、6、7。我想出了一个表格设计,但想获得反馈,如果该设计可行,或者是否有更好的方法来构建它。

会有一个 Question 表,其中包含 Id(键)和 Text 列。树本身将表示为:

QuestionId | PreviousId | NextId | Branch Condition
1                0            2      NULL
2                1            3      Yes
2                1            4      No
3                2            7      NULL
4                2            5      NULL
5                4            6      NULL
7                3            0      NULL
7                6            0      NULL

它的工作方式,一旦回答了问题,系统将检查当前问题的分支条件是什么,如果为 null 则移动到 nextId。否则找到用户选择的答案并转到相关的 nextId。我们只希望 Y/N 问题出现分支。

我现在保留的previousId,以防用户希望能够返回并重新提出问题,目前他们只想继续前进。

【问题讨论】:

  • 您可能希望保持表结构简单,而是使用某种工作流引擎框架来确定下一个回答的问题应该是什么。类似于其中之一:manageability.org/blog/stuff/workflow_in_java/view
  • 这些问题总是是/否,还是也有多项选择题?我曾经写过类似的东西,但有多个答案问题
  • 您真的需要PreviousId 吗?听起来你在复制数据
  • @ZoharPeled 开放式问题和 Y/N。但是分支只会在 Y/N 时发生。
  • @JamesZ 我要删除的 PreviousId,但保留它以防用户决定他们也想遍历树,例如,如果他们想返回并更改并回答。

标签: sql sql-server sql-server-2008 database-design


【解决方案1】:

如果只有是/否问题可能有不同的下一个问题,我建议在问题表中添加 2 列,以在答案为 时指定下一个问题 id(或默认,当它是不是是/否问题)和下一个问题 ID(当答案为 时)。在我看来,保留先前的答案 ID 似乎是多余的,因为您可以轻松地将应用程序本身的整个问题路径保存在内存中。

但是,如果将来某个时候你还会有多项选择题,并且下一个问题将取决于答案(即类别和子类别),那么我建议你添加一个答案表也是如此,并在问题表和答案表中为下一个问题 ID 保留一列。
如果下一个问题 id 不依赖于答案,则将其保存在问题表中。如果它依赖于答案,则将null放在问题表的下一个问题id列中,并将下一个问题id保留在答案表中。 这将为您提供最大的灵活性和足够简单的数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2012-02-19
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多