Подскажите со структурой бд

Discussion in 'PHP' started by -=Zhenek=-, 18 Jun 2011.

  1. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Нужно сделать статистику посещения сайтов...

    Например у нас 10 сайтов.
    26 стран
    и 100 юзеров.

    Нужно сделать структуру БД такую, чтоб было удобно выбирать стату по странам, странам и юзерам.

    Если каждый день добавлять на каждого юзера список сайтов и стран.

    то получается на каждого юзера в день нужно добавить 26000 строк.

    а при 100 уже 260 000 а в месяц 7 800 000 а за год? а при 500 юзерах? базу данных разорвет..

    Количество стран и сайтов может меняться.. добавляться и удаляться..поэтому нет смысла вносить их в структуру БД.

    Как быть? создавать папку текущую дату и туда на каждого юзера фаил с данными. и при открытии открывать его забивать данные в массивы и делать выборку? (
     
  2. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Тебе не обязательно каждого юзера записывать в БД. Просто делай инкремент нужного значения при просмотре сайта юзером.
     
  3. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Сайты находятся на другом сервере и статистику с них забирает крон раз в 5 минут..

    А если делать инкимент, то нужно иметь какуюто структуру бд..

    или это будет ид,суб,домен,уник,хост,сайт,...26 стран,

    да тут записей меньше но гибкости нет, т.к при добавлении страны нужно менять структуру БД и коды.
     
  4. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Погугли по запросу sql countries country_id
     
  5. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    не, код страны мне не важен.. У меня их короткие обозначения RU UA GB

    Объясню : юзер зашел с ИП страны Греция по ссылке юзера 3 на сайт 1
    юзер 2 зашел с ИП страны Россия по ссылке юзера 100 на сайт 10

    так вот.. Юзер 3 хочет посмотреть сколько человек зашло по его ссылке и на какой сайт и с какой страны.

    А иметь таблицу с заходами юзеров и вытягивать оттуда еще хуже. т.к при посещаемости 500 уников и 10 сайтах уже 5000 записей. А юзер зашедший на каждый сайт в отдельности считается уникальным..

    Поэтому я уже упростил задачу и такая БД ведется у каждого сайта в отдельности. а я просто потом забираю инфу в виде цифр (Юзер1:ru:уников,хостов) и ее нужно компактно разместить в БД.

    Как например liveinternet ведет стату? там добрая тысяча параметров и миллионы заходов..

    upd поискал в нете готовые решения ведущие статистику, наткнулся на Affiliator. он создает целых 9 таблиц для статистики. по часам,по дням,по сайтам,по юзерам

    Насколько это лучше? иметь 10 таблиц по 500 000 записей или одну в 5 000 000 ? что производительнее?
     
    #5 -=Zhenek=-, 18 Jun 2011
    Last edited: 18 Jun 2011
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Почему вы так решили?

    Сделать 4 таблицы. Три из них - на сайты (site_id, прочие относящиеся к сайтам столбцы), на страны (country_id, country_name), на юзеров (user_id, прочие столбцы)

    Четвертая - собственно посещения с внешними ключами на site_id, country_id, user_id плюс дата, количество хитов за сегодня.

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

    Выборку можно осуществлять обычным JOIN'ом

    Можно обойтись и без хранимых процедур, все станет не сильно сложнее

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

    Чувствую вот это ваше "упрощение" выйдет вам боком еще не один раз

    З.Ы, интересно услышать критику.
     
    _________________________
  7. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Gifts , как вы посоветовали, сейчас так и реализованно. Разные таблицы и в стате просто указывается ИД сайта,ид юзера,ид страны. А потом выборку делаем.

    Ссылка у каждого юзера своя имеет вид site.ru?user=user_id
    И на сайтах в стату добавляется инфа и просто ИД юзера без проверки есть ли такой юзер вообще(т.к таблица с юзерами на главном сайте).


    Например сегодня я добавил новый сайт в статистику, проще добавить его в админке, чем создать новое поле в БД, со странами так-же. (п.с а стран много=) даже не считая мелкие их 247).

    БД ведется статистики отдельно. Чтобы не нагружать основной сайт. т.к лучше раз в 5 минут забрать готовые данные, чем каждое посещение отсылать пост запросом на главные сайт.


    Видимо тогду лучше сделать 5 таблицы. Одна общая статистика, вторая по юзерам, третья по странам, по сайтам и т.д
    т.к например если смотреть просто стату мы при выборке затронем 500000 записей, а если по странам другие 500000 а не всегда перебирать из миллиона.

    И еще подумал, не по крону создавать всем в начале дня таблички, а при первом заборе статы. и если для этого ака и этой страны есть посещение, то делать. это сократит кол-во записей раза 4 (не все юзеры будут активно приглашать еще и из 247 стран)

    Но тут пропадает гибкость( Нельзя будет вывести комбинированную стату сайт+юзер (для админа).

    UPD а что если так и хранить всю стату на сайтах, а при запросе статы в главном сайте делать курл запрос на спец фаил (который по переданным параметрам сделает выборку и вернет результатт в виде уники:равы:юзер:дата) а сайт распарсит и выведет стату... Тогда размер БД равномерно распределится по сайтам. а стату запрашивают не так часто чтоб забить канал
     
    #7 -=Zhenek=-, 19 Jun 2011
    Last edited: 19 Jun 2011
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Вы не путаете ли понятия? У вас таблица стран будет состоять из двух столбцов - ID страны, название страны. В чем проблема добавления сюда новой страны?

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

    Равномерно продублируется, займет место и количество запросов возрастет в N раз. Оно вам надо?
     
    _________________________
  9. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Абсолютно нет. и.к в посте 1 я сказал нет смысла вносить в "структуру" , в посте 6 вы спросили почему я так решил. Я имел ввиду в структуру самой таблицы статистики.

    Да с 5 таблица согласен, идея глупая.. Странно что в таком движке как affiliate так реализованно.

    Остановился на сохранении статы на самих сайтах.
    И при запросе на главном просто аяксом делаю запрос на фаил ответчик на сайте и он по переданным ему данным делает выборку в базе и передает в ответ пару килобайт текста, которые парсятся и заполняют таблицу.
    Раз в неделю крон удаляет старые данные.