我用python,flask,sqlalchemy和postgreSQL做过两个问答游戏。
在第一个项目中,我有一个表question
,并将所有可能的答案也保存到该表中:我有一个列possible_answes
和correct_answers
(都简单地TEXT
列)。一个问题可以有多个答案并可以解决问题,因此我仅定义了一个自定义定界符:DELIMITER
。我保存了这样的答案:
AnswerADELIMITERAnswerBDELIMITERAnswerCDELIMITER
正确答案的保存方式相同。
在我选择所有问题的视图中,我不得不分割possible_answers字符串以获取所有可能的答案:
{% for question in all_questions %}
{{ question.question }}
{% for answer in question.possible_answers.split("DELIMITER") %}
{{ answer }}
{% endfor %}
{% endfor %}
这带来了一些问题,例如在检查正确答案时,我必须确保"
和'
符号可以正常工作。用户也不能添加包含我的自定义定界符字符串的答案(这从未发生,这里的机会极低)。
总的来说,我知道这种方法是不好的,而且不是动态的。它迫使我花更多的时间来使它工作。
在第二个项目中,我将答案保存在表answer
中,question
表通过一对多关系链接到answer
表。在那里,我可以用布尔列标记正确的答案,而且我还可以轻松保存统计信息。也可以让用户添加他想要的任何内容。
这种方法是可行的方法,但它有一个缺点。选择查询要慢得多,因为每个答案都会执行一个新的选择查询:
Question_addresses_Answer = relationship("Answer", back_populates="Answer_addresses_Question")
{% for answer in question.Question_addresses_Answer %}
{{ answer }}
{% endfor %}
在第一个项目中,我能够在页面加载时加载50个问题(每个回答4个答案),已经完成了50个选择查询。
在第二个项目中,如果我加载50个问题,每个问题有4个答案,则需要250个选择查询,这需要花费更长的时间。
几乎没有区别,但是值得注意,谷歌的页面速度告诉我减少服务器响应时间。这就是为什么我在这里研究性能问题的原因。
也许这甚至不是问题吗? (两个项目都链接在底部)
我已经有了一个解决方案:将选定问题的所有ID都加载到数组中,并在页面加载时仅加载第一个问题的答案。如果用户回答了第一个问题,我将检查下一个问题ID,然后加载答案。我确信这会起作用。
但是我的问题是,即使在这里,是否有某些情况值得打破数据库规则以获得更好的性能?
如果有人感兴趣,那么两个项目都将上线:
项目1测验:https://www.path-of-exile-builds.com/quiz
项目2测验(选择任意一项):https://www.quizzesworld.com/result/quizzes