Расчет рейтинга показов рекламы - PullRequest
1 голос
/ 15 сентября 2009

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

Как лучше всего рассчитать рейтинг показов при сохранении внешнего вида "случайных" объявлений? Как будет выглядеть структура таблицы для базы данных? Должен ли расчет выполняться в базе данных или в коде?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2009

вот отличное решение, которое учитывает вес, его холодное слияние, но sql там тоже товар

DECLARE @girl TABLE (
id INT IDENTITY( 1, 1 ),
name VARCHAR( 50 ),
weight INT
);


INSERT INTO @girl
(
name,
weight
)(
SELECT 'Sarah', 100 UNION ALL
SELECT 'Libby', 30 UNION ALL
SELECT 'Lisa', 30 UNION ALL
SELECT 'Molly', 250 UNION ALL
SELECT 'Kit', 50
);

SELECT
g.id,
g.name,
g.weight
FROM
@girl g
INNER JOIN
(

--
--In this inner query, we need to select a random,
--weighted ID. We are doing this in the inner query
--rather than in the outter query so that our
--intermediary table doesn't need to contain so
--much information (just the ID).
--->
SELECT TOP 1
g.id
FROM
@girl g
INNER JOIN
pivot1000 p
ON
(
-- Use the weights. --->
g.weight >= p.id

--Use any additional filtering that is required by the business logic of the query criteria.

AND
g.name != 'Lisa'
)
ORDER BY
-- Select random row. --->
NEWID() ASC

) AS temp_id
ON
g.id = temp_id.id
1 голос
/ 15 сентября 2009

Некоторые связанные Вопросы, которые также могут быть полезны:

0 голосов
/ 27 октября 2010

Мы написали функцию MySQL для нашего рекламного сервера с открытым исходным кодом AdServerBeans MyAds (http://www.adserverbeans.com), которая выбирает баннер случайным образом с учетом доли трафика:

DELIMITER ;;
DROP FUNCTION if exists get_random_banner_by_traffic_share;
CREATE FUNCTION get_random_banner_by_traffic_share(valid_banners TEXT, total_traffic_share INTEGER)
RETURNS INTEGER
NOT DETERMINISTIC
BEGIN
       DECLARE pos INTEGER DEFAULT 1;
       DECLARE rnd INTEGER DEFAULT 0;
       DECLARE current_traffic_share INTEGER DEFAULT 0;
       DECLARE banner_id INTEGER;
       DECLARE banner_traffic_share INTEGER;
       SET rnd = RAND()*(total_traffic_share-1)+1;
       WHILE pos < LENGTH(valid_banners) DO       
         SET pos = POSITION(';' IN valid_banners);
         SET banner_id = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED);
         SET valid_banners=SUBSTRING(valid_banners FROM pos+1);
         SET pos = POSITION(';' IN valid_banners);
         SET banner_traffic_share = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED);
         SET valid_banners=SUBSTRING(valid_banners FROM pos+1);
         if(current_traffic_share < rnd and rnd <= (banner_traffic_share+current_traffic_share)) THEN
            RETURN banner_id;
         END IF;
         SET current_traffic_share=current_traffic_share+banner_traffic_share;
       END WHILE;
END;
;;
delimiter ;

Хранимые процедуры / функции MySQL не поддерживают массивы / списки. Поэтому нам пришлось использовать строку с разделителями. В этой функции обратите внимание на строку:

SET rnd = RAND()*(total_traffic_share-1)+1;

, который случайным образом выбирает значение от 1 до 100. Затем мы ищем баннер, который находится в этом диапазоне. Обратите внимание, что этот алгоритм, вероятно, подходит для небольшого количества объявлений, ориентированных на одно и то же место. У вас может быть другая история.

...