结构流程图类型数据库中的数据

时间:2014-05-05 21:51:47

标签: sql database-design flowchart

我试图决定如何在数据库中构建信息。我有一系列问题,每个问题都有答案,根据选择的答案,它会转移到一组不同的问题上。这样的流程图。构建和使用此类数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

flowchart通常是treedirected graph结构,这意味着在数据库中表示它的合理方式是父子关系。

考虑以下表格:

questions
| id | question                        |
|  1 | What is your name?              |
|  2 | What is your quest?             |
|  3 | What is your favorite color?    |
|  4 | What is your quest?             |
|  5 | What is the capital of Assyria? |

answers
| id | question_id | next_question | answer                   |
|  1 |           1 |             2 | Sir Launcelot of Camelot |
|  2 |           2 |             3 | To seek the Holy Grail   |
|  3 |           3 |          NULL | Blue                     |
|  4 |           1 |             4 | Sir Robin of Camelot     |
|  5 |           4 |             5 | To seek the Holy Grail   |

我们将问题表示为树中的节点,连接到一个或多个答案,然后再指向下一个问题。

                          a3 - NULL
                        /
                a2 - q3
              /
      a1 - q2 
   /
q1 
   \
      a4 - q4
              \
                a5 - q5

一些示例查询:

-- Get all possible answers for the root question
SELECT * FROM answers WHERE question_id = 1;

-- Get the next question given a selected answer
SELECT * FROM questions WHERE id = 4;

正如您可能看到的,这并不完美。特别是,在此示例中,相同的问题可能会导致不同的未来选择,这意味着我们必须复制问题(q2q4),但是如果我们考虑问题,这确实有意义和整个树的答案,而不是单独的问题 - 尽管问题的文本是相同的,其背景导致不同的未来问题。这取决于您的用例,是否需要考虑此类情况。

你还会注意到,两者都可能没有进一步的问题,因为没有可接受的答案。您应该同样决定如何处理这个问题,但有一种可能性就是创建另一个表actions,可以从no_answer_action中的questions列指向,或action中的可选answers列,例如:

actions
| id | action                               |
|  1 | Cast into the Gorge of Eternal Peril |
|  2 | The other side he see                |

通过使用此父子关系,您可以有效地在问题和答案之间创建one-to-many mapping。你可能会发现你需要一个多对多关系(虽然在流程图中,我认为不是),如果你的数据足够复杂,在这种情况下你有一个问题表,一个表的答案,和附表列出了问题和答案的配对。

Credit Monty Python:http://www.sacred-texts.com/neu/mphg/mphg.htm#Scene%2035