2010-02-22 4 views
2

У меня есть новая таблица, которую я собираюсь добавить в кучу других обобщенных данных, в основном для снятия некоторой нагрузки, вычисляя недельные avgs.Дизайн базы данных для суммированных данных

Вопрос в том, будет ли мне лучше с одной моделью над другой. Одна модель с днями недели в виде столбца с дополнительной колонкой для цены или другой модели в виде серии полей для DOW, каждая из которых принимает цену.

Хотелось бы узнать, что спасет меня в скорости и/или головной боли? Или, по крайней мере, компромисс.

IE.

ID OBJECT_ID MON TUE WED THU FRI SAT SUN SOURCE 

ИЛИ

ID OBJECT_ID DAYOFWEEK PRICE SOURCE 

ответ

6

Я бы отдал предпочтение первым aggreate модель:

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 

Вы бы тогда быть в состоянии aggreate вышеуказанные данные для формирования средних значений для каждой недели/месяц/год очень легко и относительно быстро.

Чтобы получить список еженедельных средних, вы могли бы сделать следующее:

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); 

я выбрал бы только для более де нормированных вариантов, как два вы предложили, если указанные агрегаты все равно будут слишком дорогими, чтобы вычислить.

2

я проголосовал бы за секунду. Сперва вам понадобятся некоторые ограничения, чтобы гарантировать, что в любой строке есть только одна из MON, TUE, WED, THU, FRI, SAT, SUN. Конечно, со вторым вам могут понадобиться дополнительные справочные данные для определения Дней недели, для заполнения DAYOFWEEK.

UPDATE:

Хорошо это не было ясно, что всегда будет цена на каждый день. В этом случае моя точка зрения о ограничениях не так достоверна. Я все же предпочел бы вторую модель, но, похоже, ее лучше нормализовать. Я не знаю достаточно об этом случае сейчас, чтобы сказать, если это подходящее время, чтобы отбросить некоторые хорошие методы нормализации для ясности и производительности, но это может быть ...

+0

Ну, если я не ошибаюсь ... им понадобятся все столбцы, заполненные первой, цена за каждый день ... такая же информация займет 7 строк данных во второй модели, только займет 1 во-первых. – holden

+0

@holden: Ах, было непонятно, что всегда будет цена за каждый день. – FrustratedWithFormsDesigner

+0

Да ... извините. Я должен был уточнить. Ни одно из полей не может быть пустым в любой из этих моделей. – holden