Xpoint
   [напомнить пароль]

Баннерный движок

Метки: [без меток]
[удл]
2006-03-16 23:42:09 [обр] Иван Шумков(0/77)[досье]

Первым делом попробывал phpAdsNew, но после вставки баннера коннект с БД рвался (вне зависимости от настройки "использовать имеющиеся соединени"). Вобщем пришлось к сожалению отказатся и писать свое (плотная интеграция с движком обязательна для заказчика).
Достаточно двух сущностей: баннер и рекламное место. Связть many-to-many. У баннера может быть ограничения по времени (старт и конец компании) и по количеству показов, а также вес (тоесть приоритет). Следовательно нужна еще табличка где будем хранить показы в виде: индификатор баннера, индфифкатор места и время просмотра.

Вопрос возник в алгоритме выбора нужного баннера, если их несколько на одном месте. Ясно что общее число показов должно делится на баннеры примерно поровну. Если у баннера указан приоритет, то он должен показываться чаще.

Господа, поделитесь идеями.

спустя 1 час 13 минут [обр] Иван Шумков(0/77)[досье]
Пришло в голову:
Если один баннер на место то берем его, если больше, то берем баннер с минимальным числом показов и с максимальным приоритетом и с условием что предыдущий раз был не он.
спустя 52 минуты [обр] Иван Шумков(0/77)[досье]

И такой еще вопрос:
Может просмотры не выносить в отдельную таблицу, а хранить просто число просмотров рядом с остальной информацией о баннере? В таком случае запросы к БД упрощяются и будут намного быстрее, так как таблица просмотров разрастется потом немоверно и подсчеты будут очень серьезно бить по производительности.

P.S. У меня ужасное чувство, что я изобретаю велосипед.

спустя 8 часов [обр] gal[досье]

Я бы выбирал банер используя следующую схему.

  1. для каждого банера запоминаем время последнего показа и количество показов, также каждый банер имеет приоритет.
  2. Учитываем (или расчитываем) общее количество показов.

банер выбираем по согласно коэфициента который расчитываем по формуле:

 К = По / Пб * ПР * Тпп;

где
К - коэфициент по которому выбираем банер (максимальный коэффициент соответствует выбранному банеру)
По - общее количество показов всех банеров
Пб - количество показов конкретного банера
Пр - приоритет банера
Тпп - Время прошедшее с последнего показа банера.

Таким образом банеры с большим приоритетом будут показываться чаще. Хотя возможно что время тут лишнее.
Да и еще одно условие. в выборе не должен участвовать банер который был показан последним на данном месте(если конечно банеров очень много, если их например всего 2 и у одного приоритет 10 а у другого 5 то полюбому один будет повторяться чаще)

Можно также сделать так чтобы одному и томуже пользователю не показывался 2 раза подряд 1 и тот же баннер.

спустя 3 дня [обр] Hankin(0/9)[досье]

По поводу таблицы показов:
Стоит быть аккуратнее. Когда-то поставили себе phpAdsNew и по глупости включили функцию хранения подробной статистики. За несколько месяцев таблица выросла до 4.5 миллионов записей и любое обращение к ней останавливало MySQL сервер.
Я бы хранил только количество показов баннеров (если не требуется иное конечно).

Насчет ограничений выборки:
Нет ничего страшного в том, чтобы показать баннер на одном и том же рекламном месте несколько раз подряд. Важно стараться не показывать баннер несколько раз подряд одному и тому же посетителю.

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

SELECT *,priority*RAND() as sort FROM banners WHERE .... ORDER BY sort DESC LIMIT 2;

limit 2 это на случай если первый выбранный баннер только что был показан этому посетителю.
(Приведенный выше запрос - это для MySQL. Когда-то столкнулся с проблемой, пытаясь сделать подобный запрос на mssql - там RAND() высчитывается один раз, в момент запроса. И потом полученное значение подставляется во все ряды выборки. В таком случае результат, естественно, не имеет смысла)

спустя 3 дня [обр] Иван Шумков(0/77)[досье]
Пока остановился на варианте, чтобы показывать баннеры равное количество раз, просто делая ... ORDER BY `views` ASC, `priority` DESC LIMIT 1.
спустя 4 года 3 месяца [обр] gorky[досье]
Если нужно просто и без геморроя - рекомендую http://promofor.me/, вся логика на стороне сервиса, а вы просто в шаблон сайта одну строчку вставляете.
Powered by POEM™ Engine Copyright © 2002-2005