Я бы отдал первое предпочтение следующей совокупной модели:
ID | OBJECT_ID | DATE | PRICE | SOURCE
---+-----------+------------+--------+--------
1 | 100 | 2010/01/01 | 10.00 | 0
2 | 100 | 2010/01/02 | 15.00 | 0
3 | 100 | 2010/01/03 | 20.00 | 0
4 | 100 | 2010/01/04 | 12.00 | 0
После этого вы сможете очень легко и сравнительно быстро собрать вышеуказанные данные, чтобы получить средние значения для каждой недели / месяца / года.
Чтобы получить список средних недельных значений, вы можете сделать следующее:
SELECT WEEK(date), AVG(price) FROM table GROUP BY WEEK(date);
Для некоторых других примеров следующий запрос вернет среднюю цену по воскресеньям:
SELECT AVG(price) FROM table WHERE DAYOFWEEK(date) = 1;
Или, может быть, получить среднесуточную цену за 8-ю неделю года:
SELECT AVG(price) FROM table WHERE WEEK(date) = 8;
Также было бы довольно легко получить среднемесячные или годовые значения:
SELECT MONTH(date), AVG(price) FROM table GROUP BY MONTH(date);
Я бы выбрал только более ненормализованные варианты, такие как два, которые вы предложили, если перечисленные выше агрегации все еще будут слишком дорогими для вычисления.