Какой макет таблицы базы данных следует использовать для быстрого поиска агрегированных / отдельных данных для диапазона дат? - PullRequest
0 голосов
/ 05 октября 2011

Я пишу веб-приложение для анализа журнала моего веб-сервера.

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

Я бы хотел, чтобы пользователь веб-приложения ввел диапазон дат, а затем вернул веб-приложение:

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

(Вы можете увидеть эту идею в Google Analytics.)

У нас около 100 000 уникальных клиентских IP-адресов в месяц, и я хочу хранить денормализованные данные в течение года (хотя многие из этих клиентских IP-адресов будут одинаковыми по месяцам).

  1. Каким будет макет таблицы для размещения денормализованной информации?
  2. Какими были бы SQL-запросы для веб-приложения для эффективного извлечения нужной информации?

(я не спрашиваю, как сделать так, чтобы задание SQL записывалось в эти таблицы; это я могу выяснить.)

1 Ответ

0 голосов
/ 05 октября 2011

Я бы суммировал количество обращений по SQL-заданию и поместил бы ежедневный результат в таблицу, например [logsum]:

Table [logsum]:
sum_id (int / auto_increment)
sum_day (date)
sum_name (string)
sum_count (number)

и денормализованные данные журнала в [logaccess]:

Table [logaccess]:
access_id (int / auto_increment)
access_day (date)
access_ip (string)
access_browser (string)
access_os (string)
access_click_count (int)

SQL-работы:

1) Добавить все записи журнала в [Loginfo] и суммировать клики по IP и дням

for each line in log
{
  info = parse(line)
  execute_sql('REPLACE logaccess
               SET 
                 access_day=date(),
                 access_ip='& info[IP] &',
                 access_browser'& info[browser] &',
                 access_os='& info[OS] &',
                 access_click_count=IF(ISNULL(access_click_count),0,access_click_count) + 1) 
               WHERE access_day=date() AND access_ip='& info[IP] &';')
}

2) Подведите итоги и сохраните в [logsum]:

//- get OS count per day
res = execute_sql('SELECT access_day, access_os, count(access_id) AS C FROM logaccess GROUP BY access_day, access_os;');

//- write to [logsum]
for each record in res
{
   REPLACE logsum SET 
     sum_day=record['access_day'],
     sum_name=record['access_os'],
     sum_count=record['c']
   WHERE sum_day=record['access_day'] AND sum_name=record['access_os'];
}


//- get browser count per Day
res = execute_sql('SELECT access_day, access_browser, count(access_id) AS C FROM logaccess GROUP BY access_day, access_browser;');

//- write to [logsum]
for each record in res
{
   REPLACE logsum SET 
     sum_day=record['access_day'],
     sum_name=record['access_browser'],
     sum_count=record['c']
   WHERE sum_day=record['access_day'] AND sum_name=record['access_browser'];
}

//- get IP count per Day
res = execute_sql('SELECT access_day, count(access_id) AS C FROM logaccess GROUP BY access_day;')

//- write to [logsum]
for each record in res
{
   REPLACE logsum SET 
     sum_day=record['access_day'],
     sum_name='ip',
     sum_count=record['c']
   WHERE sum_day=record['access_day'] AND sum_name='ip';
}

//- get click count per Day
res = execute_sql('SELECT access_day, sum(access_click_count) AS C FROM logaccess GROUP BY access_day;')

//- write to [logsum]
for each record in res
{
   REPLACE logsum SET 
     sum_day=record['access_day'],
     sum_name='clicks',
     sum_count=record['c']
   WHERE sum_day=record['access_day'] AND sum_name='clicks';
}

3) очистить / удалить записи старше 1 года:

DELETE FROM logaccess WHERE access_day<DATE_ADD(date(),INTERVAL 1 year)

Может быть, это поможет вам С уважением Томас

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