我试图决定如何在数据库中构建信息。我有一系列问题,每个问题都有答案,根据选择的答案,它会转移到一组不同的问题上。这样的流程图。构建和使用此类数据的最佳方法是什么?
答案 0 :(得分:1)
flowchart通常是tree或directed 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;
正如您可能看到的,这并不完美。特别是,在此示例中,相同的问题可能会导致不同的未来选择,这意味着我们必须复制问题(q2
和q4
),但是如果我们考虑问题,这确实有意义和整个树的答案,而不是单独的问题 - 尽管问题的文本是相同的,其背景导致不同的未来问题。这取决于您的用例,是否需要考虑此类情况。
你还会注意到,两者都可能没有进一步的问题,因为没有可接受的答案。您应该同样决定如何处理这个问题,但有一种可能性就是创建另一个表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