Нужно сделать статистику посещения сайтов... Например у нас 10 сайтов. 26 стран и 100 юзеров. Нужно сделать структуру БД такую, чтоб было удобно выбирать стату по странам, странам и юзерам. Если каждый день добавлять на каждого юзера список сайтов и стран. то получается на каждого юзера в день нужно добавить 26000 строк. а при 100 уже 260 000 а в месяц 7 800 000 а за год? а при 500 юзерах? базу данных разорвет.. Количество стран и сайтов может меняться.. добавляться и удаляться..поэтому нет смысла вносить их в структуру БД. Как быть? создавать папку текущую дату и туда на каждого юзера фаил с данными. и при открытии открывать его забивать данные в массивы и делать выборку? (
Тебе не обязательно каждого юзера записывать в БД. Просто делай инкремент нужного значения при просмотре сайта юзером.
Сайты находятся на другом сервере и статистику с них забирает крон раз в 5 минут.. А если делать инкимент, то нужно иметь какуюто структуру бд.. или это будет ид,суб,домен,уник,хост,сайт,...26 стран, да тут записей меньше но гибкости нет, т.к при добавлении страны нужно менять структуру БД и коды.
не, код страны мне не важен.. У меня их короткие обозначения RU UA GB Объясню : юзер зашел с ИП страны Греция по ссылке юзера 3 на сайт 1 юзер 2 зашел с ИП страны Россия по ссылке юзера 100 на сайт 10 так вот.. Юзер 3 хочет посмотреть сколько человек зашло по его ссылке и на какой сайт и с какой страны. А иметь таблицу с заходами юзеров и вытягивать оттуда еще хуже. т.к при посещаемости 500 уников и 10 сайтах уже 5000 записей. А юзер зашедший на каждый сайт в отдельности считается уникальным.. Поэтому я уже упростил задачу и такая БД ведется у каждого сайта в отдельности. а я просто потом забираю инфу в виде цифр (Юзер1:ru:уников,хостов) и ее нужно компактно разместить в БД. Как например liveinternet ведет стату? там добрая тысяча параметров и миллионы заходов.. upd поискал в нете готовые решения ведущие статистику, наткнулся на Affiliator. он создает целых 9 таблиц для статистики. по часам,по дням,по сайтам,по юзерам Насколько это лучше? иметь 10 таблиц по 500 000 записей или одну в 5 000 000 ? что производительнее?
Почему вы так решили? Сделать 4 таблицы. Три из них - на сайты (site_id, прочие относящиеся к сайтам столбцы), на страны (country_id, country_name), на юзеров (user_id, прочие столбцы) Четвертая - собственно посещения с внешними ключами на site_id, country_id, user_id плюс дата, количество хитов за сегодня. Плюс сделать хранимую процедуру - для добавления записи в последнюю таблицу. Она (процедура) сама должна будет создавать новых юзеров в случае их отсутствия в таблице users, новых стран (хотя лучше сразу создать, стран не так много) Выборку можно осуществлять обычным JOIN'ом Можно обойтись и без хранимых процедур, все станет не сильно сложнее Все это дело позволит вам гибко добавлять произвольное количество стран/юзеров/сайтов. Осуществлять любые виды выборок, которые вы описали. Уменьшит избыточность таблиц (один юзер на разных сайтах будет записан одной строкой в таблице users) Чувствую вот это ваше "упрощение" выйдет вам боком еще не один раз З.Ы, интересно услышать критику.
Gifts , как вы посоветовали, сейчас так и реализованно. Разные таблицы и в стате просто указывается ИД сайта,ид юзера,ид страны. А потом выборку делаем. Ссылка у каждого юзера своя имеет вид site.ru?user=user_id И на сайтах в стату добавляется инфа и просто ИД юзера без проверки есть ли такой юзер вообще(т.к таблица с юзерами на главном сайте). Например сегодня я добавил новый сайт в статистику, проще добавить его в админке, чем создать новое поле в БД, со странами так-же. (п.с а стран много=) даже не считая мелкие их 247). БД ведется статистики отдельно. Чтобы не нагружать основной сайт. т.к лучше раз в 5 минут забрать готовые данные, чем каждое посещение отсылать пост запросом на главные сайт. Видимо тогду лучше сделать 5 таблицы. Одна общая статистика, вторая по юзерам, третья по странам, по сайтам и т.д т.к например если смотреть просто стату мы при выборке затронем 500000 записей, а если по странам другие 500000 а не всегда перебирать из миллиона. И еще подумал, не по крону создавать всем в начале дня таблички, а при первом заборе статы. и если для этого ака и этой страны есть посещение, то делать. это сократит кол-во записей раза 4 (не все юзеры будут активно приглашать еще и из 247 стран) Но тут пропадает гибкость( Нельзя будет вывести комбинированную стату сайт+юзер (для админа). UPD а что если так и хранить всю стату на сайтах, а при запросе статы в главном сайте делать курл запрос на спец фаил (который по переданным параметрам сделает выборку и вернет результатт в виде уники:равы:юзер:дата) а сайт распарсит и выведет стату... Тогда размер БД равномерно распределится по сайтам. а стату запрашивают не так часто чтоб забить канал
Вы не путаете ли понятия? У вас таблица стран будет состоять из двух столбцов - ID страны, название страны. В чем проблема добавления сюда новой страны? Или я вас не понял, или вы росчерком пера собираетесь пять раз бессмысленно продублировать одни и те же данные, зачем? Насчет "перебирать" из миллиона, вам известно понятие индексы и поиск по ним? Равномерно продублируется, займет место и количество запросов возрастет в N раз. Оно вам надо?
Абсолютно нет. и.к в посте 1 я сказал нет смысла вносить в "структуру" , в посте 6 вы спросили почему я так решил. Я имел ввиду в структуру самой таблицы статистики. Да с 5 таблица согласен, идея глупая.. Странно что в таком движке как affiliate так реализованно. Остановился на сохранении статы на самих сайтах. И при запросе на главном просто аяксом делаю запрос на фаил ответчик на сайте и он по переданным ему данным делает выборку в базе и передает в ответ пару килобайт текста, которые парсятся и заполняют таблицу. Раз в неделю крон удаляет старые данные.