Вчера я задал вопрос о SO под названием . Решение и реализация алгоритма трендов в Django . Многие люди предлагали простые вещи, такие как средние (экспоненциальные, взвешенные и т. Д.)
У меня есть модель под названием Book, а другая - Readers:
class Book(models.Model):
name = models.charField()
class Reader(models.Model):
date = models.DateField()
book = models.ForeignKey(Book)
reader_count = models.PostiveIntegerField()
Простая структура. Новые книги добавляются каждый день, и число читателей для каждой книги также добавляется каждый день. то есть книга будет иметь количество читателей за день для каждого дня, несколько записей.
Мне нужно рассчитать средние значения для Книг за текущую неделю, текущий месяц и текущий год. Помимо текущих данных, я бы хотел также сохранить исторические данные.
Если бы я попытался запросить данные такого рода из БД, это сильно ударило бы. Не так ли? Кроме того, я пытаюсь реализовать эту систему, используя простые средние значения для начала, но позже я хотел бы иметь гибкость в изменении моего вычислительного метода. У меня есть два варианта -
один, где я могу частично обновить данные в другой таблице, которая хранит вычисленные данные каждый раз, когда добавляется новая запись Reader
.
два, где я мог перестраивать агрегированные данные каждую ночь через скрипт для текущего дня / недели / месяца.
Вот некоторые примеры данных и результатов.
Book Date Count
---- ---------- -----
AAAA 01.01.2012 10
AAAA 02.01.2012 20
AAAA 03.01.2012 30
AAAA 04.01.2012 30
AAAA 05.01.2012 40
AAAA 06.01.2012 10
AAAA 07.01.2012 25
AAAA 08.01.2012 15
AAAA 09.01.2012 10
Среднее количество читателей за неделю № 1: 23,5.
Среднее количество читателей за неделю №2 (если бы это не было на текущей неделе): 12,5
..и для текущего месяца и года будет 21,1
НТН.
Чтобы сделать что-то из этого, я хотел бы создать систему для хранения данных. Мне нужно хранить средние значения на ежедневной, еженедельной и ежемесячной основе. Однако я очень заблудился, какую структуру таблицы мне следует реализовать? Я бы не хотел изобретать велосипед, если это возможно, поэтому, если кто-нибудь из вас знает о каких-либо пакетах, которые позволяют мне сделать это, было бы здорово.
Спасибо.