É "melhor" para ter um campo de atualização ou contagem de consulta?

votos
0

Em um Django App Eu estou trabalhando eu tenho isso acontecendo:

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)

Estou pensando em acesso avg_child_rating frequentemente. Seria otimizando se eu fiz o seguinte:

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)

A diferença agora é que cada vez que uma criança é criada / nominal / excluído, o objeto pai é atualizado. Eu sei que o criou / classificação será feita frequentemente.

O que é mais caro ?

Publicado 16/01/2009 em 02:40
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Depende da escala do problema. Se você antecipar um monte de tráfego de gravação, este pode ser um problema. É muito mais difícil de escalar escreve que lê (replicar, caching etc.) Dito isto, você provavelmente pode ir um longo caminho sem essa consulta extra causando-lhe problemas.

Dependendo de como up-to-date suas estatísticas deve ser você poderia ter algum outro processo (sessão não-web) entrar e atualizar essas estatísticas noturno.

Respondeu 16/01/2009 em 02:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more