Нет, я не про музыку решил написать. А про композицию данный, агрегацию если хотите.
В джанге на данный момент агрегации в ORM нет. Но как известно скоро должна появиться, а значит жизнь в очередной раз станет проще.
Зачем?
Но на много ли? Да, писать запросы с агрегацией станет проще. Но в большинстве случаешь выполнять запрос для сервера легче не станет. Вот ту на помощь приходит техника денормализации.
Денормализация - это добавления избыточности данных для увеличения производительности чтения данный. Обычно чтение данных требуется гораздо чаще чем их запись, а значит на запись в принципе можно потратить чуть больше времени, за-то потом много раз сэкономить на выборке. Агрегацию я привел в качестве, наверно, самого популярного источника данных для денормализации, но ею конечно не ограничивается применение денормализации. Суть в том, что лучше что-то тяжелое посчитать при записи и сохранить, чем каждый раз при чтении пересчитывать заново.
Наверно многие из вас в своих проектах писали код наподобие такого, тем более, если писали "свой блог движок":
class Post(models.Model):
comment_count = models.PositiveIntegerField(default=0)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments")
def save(self):
super(Comment, self).save()
self.post.comment_count = self.post.comments.count()
def delete(self):
super(Comment, self).delete ...