Stackoverflow gibi puan sistemi

5 Cevap php

Ben kullanıcı bazı sevap (aktivite) onun / puan artmış olan yaptığında taşma yani yığın benzer benim programda bir puan sistemi oluşturmak içiçinde çalışıyveyaum. Ben db şema + mantık açısından bu uygulama hakkında gitmek içiçinde en iyi yolu nedir merak ediyveyaum.

Ben üç seçenekten düşünebilirsiçindeiz:

  1. Kullanıcıların tabloda noktaları denilen fazladan bir alan ekleyiçinde ve her kullanıcı bir şey yok, bu alana ekleyiçinde (ancak bu tür bir aktivite göstermek mümkün olmayacaktır)
  2. Yapar sevap her kullanıcı çalışacak bir işlev oluşturun ve sıfırdan değeriçindei hesaplar ve puan alanını günceller
  3. Herhangi bir puan alan olmadan bir işlevi kullanarak her şey hesaplayın.

Bu konuda gitmek içiçinde en iyi yolu nedir? Zaman ayırdığınız içiçinde teşekkür ederiz.

5 Cevap

Şahsen ben bu sorunu yaklaşım ikinci seçeneği kullanabilirsiniz.

İlk seçenek limitleri işlevsellik, yani ben hemen ortadan kaldırır.

Üçüncü seçenek performans açısından verimsizdir - program belki de sayfa gösterimi başına (hesaplama) bu sayı birçok kez gösteren, stackoverflow gibi bir şey olup olmadığını, bu numarayı a lot getiriliyor olasıdır, ve / eylemi.

Bana göre, ikinci seçenek iyi bir melez çözümdür. Normalde, hate benim sistem (eylem ve sayı yerine, bir ya da diğer) veri çoğaltılmış olan, ama bu durumda, bir tam sayı alanı, bir kullanıcı başına kazandırır alanı oldukça küçük bir miktar lot gereksiz değerlerin yeniden hesaplanması zaman.

Biz, zaman zaman, ticaret veri depolama performansı ya da tam tersi için yer ve ben # 2. büyük ölçüde uygulamayı faydaları bir trade-off olduğunu söyleyebilirim gerekir.

Bu yüz edeceğiz beklenen hesaplamaların sayısına çok bağlıdır. Aslında, SO görünüşte sanıyorum performans nedenleriyle, 1) yaklaşımına benzer bir yöntem kullanır.

Faktörler (örneğin puan veya buraya topluluk wiki haline SO cevaplar üzerinde silinmiş öğeler, nokta kurallarında değişiklik, bu tür SO vb burada başka bir hesap katılarak gibi dış eylemleri gibi) değiştirdiğinizde de sayılar atlar önler

Bir recalc solüsyonu (2) istediğiniz ne varsa, siz ("kirli" demek hangi NULL olarak ayarlayarak) bir nokta modifikasyonu yer alabilir, her zaman değerini temizleyerek bir "akıllı" önbelleğe uygulayabilir ve bunu yeniden hesaplama Bu önbelleği aksi kullanarak, NULL olduğunda. Bir recalc belirli bir süre sonra zorlanır, böylece de (non-açık şeyler oldu kendi kendini düzelten bir tedbir olarak) bir saat, bir gün ya da her ne köknar düşünüyorum sonra değerlerini temizlemek olabilir, bağımsız "kirli" devlet .

Ben 1 ve 2 (her dakika ya da öylesine cron çalıştırmak) için giderdim.

So that: - extra field would act as a cache to the amount of point. - The function to calc the points could be a single sql query that would recalculate the points for all users at once to gain some speed.

Ben alan noktasında alınan her zaman hesaplamaya bir overkill olacağını düşünüyorum.

Şahsen ben ilk seçeneği ile gitmek ve etkinlik tarihin takip etmek için bir "Eylemler" tablosu eklemek istiyorum.

Bir kullanıcı iyi bir şey yaptığında, onlar eylem ve bazı nokta değeri ile, "Eylemler" tablosunda bir giriş olsun. Nokta değeri başka bir tablo veya bazı yapılandırma dosyasından gelebilir. Aynı değer kullanıcı kaydına eklendi alır.

Zaman içinde herhangi bir noktada, eylemleri özetlemek ve kullanıcı toplam olsun, ama eylem rekor yeterince basit olurdu eklediğinizde performans için, sadece güncelleme olabilir.

Çıkış http://code.google.com/p/userinfuser/

Eğer uygulama noktaları ve rozetleri eklemek için açık kaynak ve olanak sağlar. Bu Java, Python, PHP, Ruby ve bağları vardır.