Разработка базы данных для обобщенных данных - PullRequest
2 голосов
/ 22 февраля 2010

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

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

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

IE.

ID   OBJECT_ID   MON  TUE  WED  THU  FRI  SAT  SUN   SOURCE

OR

ID   OBJECT_ID   DAYOFWEEK   PRICE   SOURCE

Ответы [ 2 ]

6 голосов
/ 22 февраля 2010

Я бы отдал первое предпочтение следующей совокупной модели:

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

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

2 голосов
/ 22 февраля 2010

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

UPDATE:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...