Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рейтинг рефереров для счётчика
 
 автор: Alex14   (12.01.2008 в 23:24)   письмо автору
 
 

В базе данных есть таблица просмотров, одним из полей в которой являются рефереры. Требуется составить их рейтинг. При этом рефереры с одинаковым доменным имененем, хотя и разными страницами, считать одинаковыми.
Например, есть три записи

http://rambler.ru/asdf.html
http://yandex.ru/qwerty.php
http://rambler.ru/zxcvb.html

Нужно получить из них массив:

Реферер Количество просмотров
rambler.ru 2
yandex.ru 1

Это можно сделать и на PHP, но получается как-то некрасиво. Интересует, можно ли составить достаточно простой SQL-запрос. Очевидно, что тут нужно использовать регулярные выражения.

   
 
 автор: Trianon   (12.01.2008 в 23:55)   письмо автору
 
   для: Alex14   (12.01.2008 в 23:24)
 

Разумнее имена хостов продублировать в отдельном поле. А может быть даже унести в отдельную таблицу.

   
 
 автор: Alex14   (13.01.2008 в 00:03)   письмо автору
 
   для: Trianon   (12.01.2008 в 23:55)
 

В смысле, кроме поля для реферера типа http://rambler.ru/asdf.html завести ещё поле для домена rambler.ru (получающееся обрезкой реферера)? Писать во временную таблицу во время запроса статистики или писать в основную таблицу при заходе посетителя на сайт?

   
 
 автор: Trianon   (13.01.2008 в 00:10)   письмо автору
 
   для: Alex14   (13.01.2008 в 00:03)
 

Либо добавить поле домена к основной таблице. И писать туда домен параллельно с самим реферером.
Либо создать таблицу доменов. Куда заносить их при первом появлении. А в основную таблицу писать чужой ключ к таблице доменов. hits.domain_id = domains.id

   
 
 автор: Alex14   (13.01.2008 в 11:26)   письмо автору
 
   для: Trianon   (13.01.2008 в 00:10)
 

Т.е. увеличивается размер БД добавлением новой таблицы, для ускорения выполнения запроса. Такой размен объёма БД на скорость работы оправдывает себя?

   
 
 автор: Trianon   (13.01.2008 в 12:13)   письмо автору
 
   для: Alex14   (13.01.2008 в 11:26)
 

Если Вам так спичит объем БД - уберите домен из реферера перед сохранением. Совокупный объем данных в обеих таблицах будет даже меньше исходного, поскольку данные о домене храниться будут лишь однажды, а не на каждый клик.

А вообще, есть хорошее правило.
Делать проект надо тупыми честными методами, описанными в учебниках.
И оптимизировать что-либо путем отхода от этих правил стоит лишь тогда, когда проблемы производительности действительно стоят поперек горла. А не заранее.
А в учебниках (я имею в виду в любом мало мальски приличном учебном курсе по SQL) написано, что схему базы данных следует создавать и держать приведенной хотя бы к первым трем нормальным формам (там же, впрочем, обычно указывается, что обычно тем самым достигаются еще и 4-я и 5-я формы, и нужно очень сильно постараться создать БД 3-й формы, не являющуюся одновременно и 5-й).

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

   
 
 автор: Alex14   (27.01.2008 в 20:15)   письмо автору
 
   для: Trianon   (13.01.2008 в 12:13)
 

А насколько полной должна быть нормализация? В данном случае, при использовании одной таблицы есть семь полей: первичный ключ, кука, IP, User_Agent (браузер), реферер, просмотренная страница и время. Для полной нормализации следует завести ещё, помимо рефереров, отдельные таблицы для страниц и браузеров (для IP и кук это наверное не имеет смысла). При этом заметно усложнятся запросы к БД. Может разумнее для начала использовать одну таблицу, а потом по мере необходимости дробить её?

   
 
 автор: Trianon   (27.01.2008 в 21:06)   письмо автору
 
   для: Alex14   (27.01.2008 в 20:15)
 

Попробуйте использовать одну :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования