2009-09-15 2 views
1

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

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

+0

Ничего, все еще наброски на бумаге. Но я застрял в разработке, как вычислить ранг. – janhartmann

ответ

2

здесь является отличным решением, которое позволяет взвешиванием его ColdFusion, но SQL там слишком article

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 
0

Мы написали функцию 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. Затем мы ищем баннер, который находится в пределах этого диапазона. Обратите внимание, что этот алгоритм, вероятно, подходит для небольшого количества объявлений, предназначенных для одного и того же места размещения. У вас может быть другая история.

Смежные вопросы