Хранение событий для отчетности - PullRequest
0 голосов
/ 26 июля 2010

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

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

Таблица 1:

Event | Total_Count
------+------------
bar   |  1
foo   |  3

Таблица 2:

Event | Timestamp
------+----------
bar   | 1/1/2010
foo   | 1/1/2010
foo   | 1/2/2010
foo   | 1/2/2010

Есть ли лучший подходк этой проблеме?Я подумываю о преобразовании таблицы 2, чтобы сохранить подсчет дат, это должно быть более эффективным, поскольку мои запросы в диапазоне дат выполняются только для целых дат, , а не отметки времени (01.01.2010 против 1 /1/2010 00:01:12) т.е.:

Обновленная таблица 2

Event |   Date   | Total_Count
------+----------+------------
bar   | 1/1/2010 |  1
foo   | 1/1/2010 |  1
foo   | 1/2/2010 |  2

Возможно, есть еще более разумный способ решения этой проблемы?есть идеи?

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Ваш подход кажется хорошим.Я рассматриваю таблицу 2 более подробно, а таблицу 1 - сводную таблицу.По большей части вы будете выполнять вставки только в таблицу 2, а вставки и обновления - в таблицу 1.

Обновленная таблица 2 может не дать вам дополнительных преимуществ.Тем не менее, вы должны учитывать это, если агрегации по дням наиболее важны для вас.

Вы можете рассмотреть возможность добавления дополнительных атрибутов (столбцов) в таблицы.Например, вы можете добавить first_date и последнюю дату в таблицу 1.

1 голос
/ 27 июля 2010

Похоже, что на самом деле у вас нет никаких требований:

Переход с отметки времени на только часть даты является большой проблемой.Вы никогда не хотите проводить анализ времени дня?например, какое время суток лучше проводить для техобслуживания, если это останавливает "foo".

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

Таким образом, чтобы получить сумму событий за последние 3 дня, вам лучше сделать это

SELECT SUM(totcnt) FROM (
SELECT MAX(Total_count) as totcnt from table where date = today and event = 'Foo'
UNION ALL
SELECT MAX(Total_count) from table where date = today-1 and event = 'Foo'
UNION ALL
SELECT MAX(Total_count) from table where date = today-2 and event = 'Foo'
)

Да, это выглядит намного проще, чем>

SELECT COUNT(*) FROM table WHERE DATE BETWEEN today-2 and today and event = 'foo'

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

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

1 голос
/ 26 июля 2010

Я бы просто имел одну таблицу с отметкой времени вашего мероприятия. Тогда ваши отчеты просто настраивают ваше where предложение правильно ...

Или я что-то упустил в вашем вопросе?

...