Başarılar / Rozetleri sistemi

3 Cevap php

Ben cevap için bu siteyi gezen olmuştur ama hala veritabanı yapısı ve uygulanması konusunda benzer bir sistem planı nasıl biraz emin değilim.

SO güncelleştirmeleri bilmek ve belli bir süre sonra rozetleri atar rağmen: PHP ve MySQL o (tüm profil alanları dolu özel bir eylem SO durumda alındığında) bazı başarıları hemen kazanılır açık olacaktır. Pek çok kullanıcı ve ile rozetleri bu (: kullanıcıları ve rozetleri hem de yüksek sayıda ölçek açısından) performans sorunları oluşturabilir olmaz.

Yani varsayalım veritabanı yapısı gibi basit bir şey olur:

Badges     |    Badges_User      |    User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned(bool)   |  
           |    assigned_at      |

Fakat bazı insanlar bunun bir artan tarzı bir yaklaşım için daha iyi olacağını belirtti kadar 1.000.000 forum mesajlarını sahip bir kullanıcı alışkanlık herhangi bir işlevi yavaşlatabilir.

O zaman yukarıdaki badges_user tabloda artışlı ya da sadece bir 'ilerleme' alanı olabilir rozetleri için başka bir tablo olurdu?

Okuma ve için teşekkürler (SO binlerce kullanıcı ve 20 ila 40 rozetler gibi) istenen sistemin ölçeklenebilirlik odaklanın lütfen.

EDIT: Bazı karışıklık dışarı bazı demir bir Tarih / Saat gibi, rozeti ödüllendirilmesi için kriterleri en iyi her rozeti olmaz bunun için hazır sorgular / fonksiyonları içine yerleştirilmiş olacaktır assigned_at vardı? (Daha iyi esneklik)

3 Cevap

Ben (yorumlarına göre "atanmış" alanına olmadan) önerdim yapısı, ek bir tablonun eklenmesi ile, çalışmak "Submissions_User" demek, user_id bir başvuru içeren & düşünüyorum gönderimler sayma için artan bir alan. Sonra gereken istediğiniz tüm this post başına ve set olurdu galiba gibi bir "olay dinleyicisi" olduğunu.

EDIT: başarı rozetleri için, yerinde ilgili herhangi rozeti (elbette sadece bildirimi yapan kullanıcı için) her ibrazı üzerine olay dinleyicisini çalıştırın ve ödül. Zaman tabanlı rozetleri için, ben her gece bir CRON işi çalıştırmak istiyorum. Uygulanabilir olarak tam bir kez kullanıcı listesi ve ödül rozetleri döngü.

siz dahil kroki ile ilgili: badges_user üzerine boolean sütun kurtulmak. Orada hiçbir mantıklı: ilişki yüklemi bakımından tanımlanmış olduğunu "kullanıcı User_id assigned_at de rozeti bd_id kazandı".

genel soru gibi: hız için bakılmaksızın ilişkisel olmak üzere şema tanımlamak ilk (.. ki potansiyel perf yarısında kurtulurum sorunları, muhtemelen farklı mükemmeliğinin karşılığında problemleri), dizin düzgün (doğru ne bağlıdır sorgu desenleri), sonra yavaş ise, o daha hızlı olduğunu bir (hala ilişkisel) tasarımı türetmek. gibi vb, bazı büyüklükler önceden hesaplanabilir olması gerekebilir

Ben ne var benzer bir tür yapı devam edecek

Badges(badge_id, badge_name, badge_desc)
Users(user_id, etc)
UserBadges(badge_id, user_id, date_awarded)

Ve sonra ne ayrıntı düzeyini izlemek ve @ etmek istediğinize bağlı izleme tablo (s) ekleyebilirsiniz ... o zaman buna göre tablo güncelleyebilirsiniz ve set üzerinde tetikler "ödül" rozetleri için

User_Activity(user_id, posts, upvotes, downvotes, etc...)

Siz de çok diğer yönden istatistikleri izlemek ve rozet ödül tetikleyebilir

Posts(post_id, user_id, upvotes, downvotes, etc...)


Some other good points are made here