如何正确避免JOINs计算Django中的相关元素?

时间:2017-03-24 09:33:35

标签: django caching orm

在“多对一”的关系中,将“相关元素”的数量存储在“一”方面是一个很好的Django实践,还是Django有一个更好的机制来减少开销? 假设我们有两个表:“帖子”和“喜欢”,我们可以在一个帖子上有几个喜欢。我的DBA本能是在“帖子”上添加一个nb_likes字段,并在Like(post_id,user_id ...)方法中增加它。默认的Django ORM行为是进行“加入”,这似乎非常浪费。

1 个答案:

答案 0 :(得分:0)

我不知道你在哪里认为“默认的Django ORM行为是为了”加入“。

我有BlogArticle作为Article的模型,Blog上有外键。我随机选择了一个博客并运行:

blog.article_set.count()

然后检查生成的SQL查询:

SELECT COUNT(*) AS `__count` FROM `core_article` WHERE `article`.`blog_id` = 10'

所以显然没有JOIN

编辑:您在评论中添加了

  

但我关注的是页面显示的帖子列表及其各自的投票数量(或者在您的示例中显示的是一个表格,其中列出了20个博客,其中包含每个博文的所含文章数量)

事实上在这种情况下即:

Blog.objects.annotate(nb_arts=Count('article_set'))
很明显,你会在查询中加入 - 但是如果你坚持使用规范化的模式,那么你就是在编写查询的方式,所以我看不出它与Django的ORM有什么关系。

总而言之:无论语言和/或框架如何,对于您的用例,您要么坚持规范化架构并且需要加入或者不想支付/无法承担费用JOIN并且必须非规范化。这是一个“好习惯”还是另一个问题,但这与Django或你正在使用的任何语言/框架无关。