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

取決於問題的規模。 如果您預計會有很多寫入流量,這可能是一個問題。縮放寫入比讀取要困難得多(複製,緩存等)。也就是說,如果沒有額外的查詢會導致任何問題,您可能會走很長的路。

根據您的統計數據的最新情況,您可以通過其他一些流程(非網絡會話)進行訪問並每晚更新這些統計數據。

相關問題