 |
Создание базы данных для сбора статистики посещений WEB-сайта
Теперь, когда у нас появились данные, их нужно положить в какую-либо упаковку. Необходимо создать базу данных, которая вмещала бы все эти данные, и разложить все данные по полочкам, т.е. по таблицам.
База данных будет создаваться с нуля, так же как создается любой новый проект - сначала данные, потом таблицы, потом интерфейс. Следовательно и методы создания будут самые простые.
Обычно для создания базы данных используются различные программы типа Marathon, IBToolsPro, IB_Desktop и др. Не будем обсуждать достоинства или недостатки этих программных средств. Главная проблема в том, что при интерактивном изменении структуры БД возрастает вероятность ошибки (трудно запомнить, что делал вчера). Самый простой способ - написать SQL-скрипт и запустить его через WI_SQL (IB_SQL). Для других СУБД используется подобный инструмент, входящий в состав этих СУБД. Преимущество этого способа не только в его простоте. Первое - это то, что все действия фиксируются, как нормальной программе, второе - WI_SQL записывает в отчет ошибки выполнения SQL команд. Таким образом поиск глупых ошибок можно переложить на СУБД. И в-третьих, пока проект находится на стадии ИДЕИ, не требуется разработка каких-либо дополнительных средств.
Итак, начнем. Во-первых, нужно настроить параметры сессии и создать саму Базу Данных:
/*** СОЗДАНИЕ БАЗЫ ДАННЫХ АНАЛИЗА ПОСЕЩЕНИЙ САЙТА ***/
/* начало работы 02.01.2002г
СУБД InterBase v_5.6
*/
SET NAMES WIN1251; /* Устанавливает кодировку для сессии */
SET TIME ON; /* Для полей Date показывает время */
SET STATS OFF; /* Включить/выключить статистику */
SET AUTODDL ON; /* Включить/выключить Auto Commit DLL */
SET ECHO ON; /* Включить выключить эхо */
CREATE DATABASE 'azbook.rt-press.ru:D:\Firms\AZDesign Corp\wwwStat.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE=4096 DEFAULT character set win1251;
COMMIT;
/* Измените путь к базе данных и ее имя на реальные */
Для того, чтобы указанный к базе данных путь "azbook.rt-press.ru" работал, требуется правильно настроенный DNS в протоколе TCP/IP. (Естественно, что путь к Базе Данных нужно прописать тот, который используется у Вас.) В противном случае можно использовать другой вариант:
CREATE DATABASE '\\AZSRV\D:\Firms\AZDesign Corp\wwwStat.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE=4096 DEFAULT character set win1251;
После создания Базы Данных, к ней нужно подключиться:
CONNECT 'azbook.rt-press.ru:D:\Firms\AZDesign Corp\wwwStat.gdb'
USER SYSDBA PASSWORD masterkey CACHE 1000;
COMMIT;
и можно наполнять содержимым. Во-первых, необходимо описать типы данных, которые будем использовать
/* Domain definition - описание доменов */
CREATE DOMAIN AZLEGEND as CHAR(2046) character set WIN1251;
CREATE DOMAIN AZTITLE as CHAR(254) character set WIN1251;
CREATE DOMAIN AZLNAME as CHAR(62) character set WIN1251;
CREATE DOMAIN AZNAMES as CHAR(30) character set WIN1251;
CREATE DOMAIN AZNOTXT as CHAR(16) character set WIN1251;
COMMIT;
После чего создаем таблицы. Первая таблица VizitLog нужна для хранения тех данных, которые мы получаем от сайта, как результат работы StatSQL.cgi. Это не значит, что данные всегда будут храниться в ней - это слишком расточительно и неудобно. Кроме того, если приглядеться к полям таблицы VizitLog, окажеться что некоторые лишние или не используются. Это связано с тем, что сначала использовались все значения, которые дают переменные окружения в Perl, после анализа поступающих данных какие-то поля отбрасывались, какие-то меняли свои назначения.
/* Первичный протокол посещений (результат StatSQL.cgi) */
CREATE TABLE VIZITLOG (
VizDate Date, /* Дата визита */
UserID Integer, /* Код пользователя – через соккет */
DateFirst Date, /* Дата первого визита */
DateLastA Date, /* Дата визита */
DateLastB Date, /* Дата последнего визита */
RemoteIP Integer, /* Адрес удаленного компьютера */
RemoteAddr Char(16) character set Win1251, /* Адрес удал. компьютера ххх.ххх.ххх.ххх */
RemotePort Integer, /* порт удаленного компьютера */
RemoteHost AZLEGEND, /* Имя удаленного компьютера */
http_via AZLEGEND, /* имя Proxy-сервера */
http_agent AZLEGEND, /* имя браузера посетителя */
http_lang AZTITLE, /* языки поддерживаемые пользователем */
http_cache AZTITLE, /* контроль состояния Cache */
Server_Name AZTITLE, /* Имя сервера (совпадает с именем домена?) */
Server_Soft AZTITLE, /* Программное обеспечение на сервере */
Server_admin AZTITLE, /* E-Mail администратора домена */
http_host AZTITLE, /* имя домена текущего сайта */
Server_Port Integer, /* Порт сервера – 80, 8080, 8081 и т.д. */
Query_string AZTITLE, /* Строка запроса по GET или POST */
http_ref AZLEGEND, /* адрес страницы, откуда пришел посетитель */
http_page AZLEGEND, /* адрес страницы, куда пришел посетитель */
doc_uri AZLEGEND, /* uri страницы, куда пришел посетитель */
doc_name AZTITLE, /* имя документа */
doc_size Integer, /* размер документа в байтах */
doc_aDate Date, /* дата последнего доступа */
doc_lmDate Date); /* дата последнего изменения документа */
COMMIT;
Итак, таблица VizitLog служит для первичного хранения данных. В основном назначение полей не требует обяснения. Поле DateFirst содержит дату первого визита пользователя, точнее дату и время, когда скрипту удалось в первый раз установить пользователю cookie. Поля DateLastA, DateLastB служат для записи даты последнего посещения. Два значения требуется для того, чтобы показывать пользователю действительно время последнего посещения(DateLastA), не не текущее.
Поля RemoteIP и RemoteAddr, отражают одну и ту же информацию, но в разных форматах. Принято адрес компьютера в сети отображать как '193.125.19.152', т.е. четыре числа разделенных точками. Скрипт StatSQL.cgi немного модифицирует эту форму, добавляя пробелы перед каждым числом, если оно меньше 3 знаков, т.е. '193.125. 19.152' и записывает в RemoteAddr. В таком варианте адреса можно правильно сортировать при выборке из таблицы. Однако, реально адрес компьютера выражается 32-х разрядным целым числом - '-1048767592', и в таком виде он записывается в RemoteIP.
Server_Name и http_host, как показала практика дают одно и тоже значение. Поле doc_aDate, как оказалось не имет смысла (в данном случае), так как всегда показывает время текущего доступа к странице.
Поле Server_Soft полезное, но оно его значение всегда постоянно (мы ведь не меняем провайдера каждый день), поэтому имеет смысл его заполнить один раз, а потом отключить.
Необходимость использования других полей будет определяться по результатам наблюдения и анализа поступающей информации.
Таблица для данных протокола создана и нужно заполнить ее конкретными данными. Для этого нужно:
1. Сохранить протокол, полученный по e-mail от StatSQL.cgi, в формате .txt
2. В начало полученного файла добавить строку "/*", начинающую комментарий. Окончание комментария уже сформировано скриптом.
3. Если в БД будет вводится только один файл, то в начало файла добавить команды подключения к БД:
SET NAMES WIN1251; /* Устанавливает кодировку для сессии */
SET TIME ON; /* Для полей Date показывает время */
SET STATS OFF; /* Включить/выключить статистику */
SET AUTODDL ON; /* Включить/выключить Auto Commit DLL */
SET ECHO ON; /* Включить выключить эхо */
CONNECT 'azbook.rt-press.ru:D:\Firms\AZDesign Corp\wwwStat.gdb'
USER SYSDBA PASSWORD masterkey CACHE 1000;
COMMIT;
Если файлов несколько, то сначала желательно объединить их в один, а потом добавить команды подключения к БД.
Далее запускаем программу Interactive SQL и выбираем в меню "Run script" –
и выбираем созданный нами скрипт SQL
и на вопрос "Save output a file?" желательно ответить утвердительно, потому что в выходном файле сохраняться и сообщения об ошибках, которые помогут отладить программу.
Продолжение следует
|