0

在Django应用程序我工作我有这个事情:有一个更新字段或COUNT查询是“更好”吗?

class Parent(models.Model): 
    name = models.CharField(...) 

    def num_children(self): 
     return Children.objects.filter(parent=self).count() 

    def avg_child_rating(self): 
     return Child.objects.filter(parent=self).aggregate(Avg('rating')) 

class Child(models.Model): 
    name = models.CharField(...) 
    parent = models.ForeignKey(Parent) 
    rating = models.IntegerField(default=0) 

我计划访问经常avg_child_rating。难道是优化如果我做了以下内容:

class Parent(models.Model): 
    ... 
    num_children = models.IntegerField(default=0) 
    avg_child_rating = models.FloatField(default=0.0) 

def update_parent_child_stats(sender, instance, **kwargs): 
    num_children = Child.objects.filter(parent=instance.parent) 
    if instance.parent.num_children != num_children: 
     instance.parent.num_children = num_children 
     instance.parent.avg_child_rating = Child.objects.filter(instance.parent=self).aggregate(Avg('rating')) 

post_save.connect(update_parent_child_stats, sender=Child) 
post_delete.connect(update_parent_child_stats, sender=Child) 

现在的区别是,每创建一个孩子的时间/额定/删除,父对象被更新。我知道创建/评级将经常进行。

更多价格昂贵

回答

3

取决于问题的规模。 如果您预计会有很多写入流量,这可能是一个问题。缩放写入比读取要困难得多(复制,缓存等)。也就是说,如果没有额外的查询会导致任何问题,您可能会走很长的路。

根据您的统计数据的最新情况,您可以通过其他一些流程(非网络会话)进行访问并每晚更新这些统计数据。

相关问题