Popülerlik Algoritma

7 Cevap php

Ben farklı kategoriler ile bir ana sahip oluyor bir digg benzeri web sitesi yapıyorum. Ben en popüler gönderimler görüntülemek istiyorum.

Ve etajer "Bunu beğendim" gibi Bizim derecelendirme sistemi, sadece "seviyor" dir. Biz temelde zaman başına "seviyor" yüksek sayıda başvuru göstermek istiyorum. Tüm zamanların popülaritesi, geçen hafta, ve son gün: Biz üç kategori var istiyorum.

Herkes yardım etmek için bir yol biliyor mu? Ben bu yapıyor ve verimli yapma konusunda gitmek için nasıl hiçbir fikrim yok. Ben her 10 dakika çalıştırın ve son 10 dakikada seviyor sayısında çekmek için cron işi çeşit kullanabilirsiniz düşündüm ... ama bu oldukça verimsiz olduğu söylendi?

Yardım?

Teşekkürler!

7 Cevap

Neden reddit source code göz değil?

Tipik Digg ve Reddit gibi siteler teslim tarihine değil oyların kez gitmek. Bu şekilde hepsini alır X süre için üst gönderimler bulmak için basit bir SQL sorgusu. İşte bu yöntemi kullanarak son 24 saat 10 en popüler bağlantıları bulmak için bir pseudo-sorgu:

select * from submissions
 where (current_time - post_time) < 86400
 order by score desc limit 10

Temel olarak, bu sorgu tüm gönderimler bulmak için söylüyor şimdi nerede ve yayınlanmıştır zaman UNIX zaman içinde 24 saat olduğu, daha az 86400 arasındaki saniye sayısı.

Eğer gerçekten X zaman aralığında popülerlik ölçmek istiyorsanız, başka bir tablodaki her oy için yazı ve saatini saklamak gerekir:

create table votes (
 post foreign key references submissions(id),
 time datetime,
 vote integer); -- +1 for upvote, -1 for downvote

Sonra şöyle X ve Y süreleri arasındaki en popüler mesajların bir listesini oluşturabilirsiniz:

select sum(vote), post from votes
 where X < time and time < Y
 group by post
 order by sum(vote) desc limit 10;

Buradan sadece bir atlama konum, atlamak ve iç uzak döndü kimlikleri bağlı sonrası verileri alıyorum katılın.

Eğer iyi bir DB kurulum var mı? Biz CREATE TABLE ayrıntıları ve endekslerin hakkında duymak miyiz? Aklı başında bir kurulum varsayarsak, DB sizin ihtiyaçlarını karşılamak için yeterince hızlı gerektiren sayar çekmek gerekir! Örneğin iki tablo verilmiş, (endeksleri ve tuşları net, bu biraz kullandığınız hangi DB motor bağlıdır):

CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)

Eğer gibi üst 33 tüm zamanların en popüler gönderimler alabilirsiniz

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

ve belli bir zaman aralığı olarak içinde oy olanlar

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

Eğer bunun yerine sadece +1, sadece SUM(likes.vote) yerine kullanabilirsiniz orada her girişi sayma, likes in "oy" (pozitif veya negatif) saklamak olsaydı COUNT s.

Bir Digg tarzı algoritması (aslında the Digg algoritması) kısa, kolay takip açıklama var here. (Bu sayfadaki bağlantıyı tıklayın etmeyin, sadece aşağı ilerleyin.)

Nobody_ cevabını tamamlamak için ben (tabii MySQL kullanıyorsanız varsa) documentation üzerine okumak öneririz.

Geçenhafta alltime, onlar sana sona erme zamanı ile önbellek listesini kaydetmek gerektiğini düşünüyorum o kadar çok hızlı bir değişim gerekiyordu çünkü gibi istikrarlı listesi için yaklaşık 1 gün veya daha uzun olduğunu.

Eğer gerçek zamanlı olarak doğru sayısı hakkında endişe varsa, önbellek en düşük sayfa sayfa karşılaştırarak, her sayfa görünümünde de kontrol edebilirsiniz.

Yapmanız gereken tüm önbellek ve gerçek veritabanı arasındaki senkronizasyon için bakım olduğunu.

thethanghn

Sipariş şimdiki zaman bazı fonksiyonudur sorgular gerçek performans problemleri olabilir. Şeyler insanlar oy olarak her kova için takvim zaman ve güncelleştirme puanları kepçe eğer çok daha basit olsun.