Nasıl SO ve yahoo cevaplar gibi kullanıcılar için bir puan sistemi oluşturma hakkında gitmeli? (PHP)

3 Cevap php

Bir kullanıcı o / o kayıpları -5 puan, bir soru sorarsa ben bir Q & A sitesi projesi için bir oylama sistemini oluşturma; , bir soru 5 cevap (tür SO ve yahoo cevaplar gibi) vb bir soru +1, oy

-> Temel aritmetik oluşturmak için, ben user_id ve bunların toplam puan ilgilidir "users_points" tablo var.

+---+---------+
| 1 | 100     |
+---+---------+
| 2 | 54      |
+---+---------+

-> Kullanıcıların belirli bir görevi yok Temelde, eğer + olur ya - puan. Nasıl 100 kere Bir cevap oylama diyelim gelen kullanıcılar engellerim. ex: Ben bir kullanıcı vs soruya, bir kez oy sadece mümkün olmak istiyorum

3 Cevap

Sen sütunları olan bir tablo oluşturmak gerekir oy: user_id, question_id, delta. Delta (Eğer sadece bir soru nokta değeri bulmak için SUM(delta) yapabilirsiniz bu şekilde) 1 olması veya -1 olmalıdır oy değeridir.

Teklik almak için (user_id, question_id). benzersiz bir dizin oluşturmak

Bu tasarım herhangi size yardımcı olmadığını görmek

relational masa design

Tüm uygun yerlere denormalize olabilir (ex için. VoteType kaldırmak ve uygun yerlerde bir boolean koymak)

Ben Neye oyunuzu hangi kullanıcı ayrıntılı bir günlüğünü tutmak olacaktır. Yani bu sütunları içeren bir tablo olabilir:

  • user_id (kullanıcı kimliği)
  • item_type ("soru" ya da "cevap" ya - bir öğe türleri tabloya ENUM veya yabancı tuşunu kullanın)
  • item_id (gerçek öğenin kimliği, örneğin bir soru kimlik veya kimlik cevap)
  • up_down (ENUM veya bir upvote veya downvote olup olmadığını temsil MANTIKSAL)

Kullanıcının "rep" hesaplamak için, app mantık oy üzerinden çalıştırmak ve soru, yukarı seçildi ise -1 cevabı çok aşağı oy ve eğer 5 eklersiniz.

Muhtemelen kolay erişim için kullanıcıların / soru / cevap tablolarda toplam değerleri saklamak istiyorsunuz. Ama arka planda günlük tutmanın büyük avantajı düzenli rep yeniden hesaplamak ve bir şey kaybetmiş değil değildir. Ayrıca kullanıcılar (daha sonra geri soruya gittiğinizde turuncu upvoted cevaplar örneğin SO gösterileri) anında hangi şeyler olarak hangi söyleyebilirim.

Ya da sadece Stack Exchange, daha kolay olurdu kullanabilirsiniz ;)