Sqlalchemy数据库查询性能比较,真的违反规则了吗?

时间:2018-09-03 11:13:07

标签: python database postgresql performance

我用python,flask,sqlalchemy和postgreSQL做过两个问答游戏。

在第一个项目中,我有一个表question,并将所有可能的答案也保存到该表中:我有一个列possible_answescorrect_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

0 个答案:

没有答案