Farklı zaman dilimlerine üzerinde puan toplamlarının yüzdelik sıralaması nasıl hesaplanır?

2 Cevap php

Bir PHP ve üzerinde CodeIgniter-tabanlı web sitesi, kullanıcılarının değil, yığın taşması aksine, çeşitli eylemler için itibar kazanabilirsiniz. Her zaman itibar eylem ödüllendirilir, yeni bir giriş user_id ile MySQL tablo oluşturulur, reytingi ve puan (örneğin 10 ünü) bu demet değeridir. Aynı zamanda, a-users tablodaki bir alan, reputation_total, güncellenir.

Bütün bu tür anlamsız bir referans çerçevesi olmadan olduğundan, kullanıcıların tüm kullanıcıları arasında yüzdelik rütbe göstermek istiyorum. Toplam itibar için, bu yeterli kolay görünüyor. Diyelim ki benim user_id olup 1138. Sadece benim daha bir reputation_total daha az users tabloda kullanıcıların sayısını, benimkinden daha düşük bir üne sahip kullanıcıların yüzdesini bulmak için toplam kullanıcı sayısını, ve bölmek saymak . Bu doğru, kullanıcı 1138 en yüzdelik sıralaması olacak? Kolay!

Ama aynı zamanda farklı zamanla itibar toplamları açıklıklı görüntüleniyor ediyorum - örneğin, itibar tabloyu sorgulama ve belirli bir tarihten itibaren kazanılan tüm puanları toplayarak içerir ki, son yedi gün içinde kazandı. Örneğin, ben genel 11. yüzdelik olabilir, ancak 50. yüzdelik bu ay ve 97 persentil bugün - Ben de yayılan farklı zaman yüzdelik rütbe göstermek istiyorum.

Bu hayır, ben üzerinden gitmek ve verilen zaman dilimi için tüm kullanıcıların itibar toplamları bulmak zorunda ve ben bu gruba giren nerede o görecekti görünüyor? Bu çok hantal değil mi? Bunu yapmanın en iyi yolu nedir?

Çok teşekkürler.

2 Cevap

Burada benim başın üst kapalı bir kaç seçenekleri düşünmek yapabilirsiniz:

  1. Eğer belirtildiği gibi, zaman aralığı sırasında kazanılan itibar puan kadar toplam ve buna göre yüzdelik hesaplar.

  2. Bir günlük bazda reputation_total güncellemeleri takip - böylece user_id, tarih, reputation_total ile bir tablo var.

  3. Her zaman aralığı için (reputation_total, reputation_total_today, reputation_total_last30days, vb) kullanıcı tabloya bazı yeni sütunlar eklemek. Ayrıca izlemek istediğiniz her zaman dilimi için yeni bir sütun eklemek zorunda sizi önlemek için ayrı bir tabloda (reputation_totals) içine bu normalleştirmek olabilir.

Seçenek # 1 en kolay, ama muhtemelen sizin itibar işlem tablosunda satır sürü varsa yavaş almak için gidiyor - çok iyi ölçek değil, gerçek zamanlı bu hesaplamak gerekir, özellikle.

Seçenek # 2 kez (günde kullanıcı başına bir satır) üzerinde daha fazla depolama alanı gerektiren gidiyor ama muhtemelen doğrudan işlem tablo sorgularken önemli ölçüde daha hızlı olacaktır.

Seçenek 3 daha az esnektir, ama büyük olasılıkla en hızlı seçenek olacaktır.

Seçenekler 2 & hem 3 olasılıkla günlük bazda toplamlarını hesaplamak için bir toplu iş süreci gerektirecektir, böylece de dikkate şey.

Ben herhangi bir seçenek mutlaka iyi olduğunu sanmıyorum - hepsi hız / depolama alanı / karmaşıklığı / esneklik farklı makasına içerir. Yapmanız sonuçta tabii ki uygulama için gereksinimlerine bağlıdır.

Bu çok aşırı karmaşık olacağını neden görmüyorum. Genellikle gerekir tüm WHERE deyimindeki gibi sonuçlar sınırlayan bir sorgu eklemek için:

WHERE DatePosted between @StartOfRange and @EndOfRange