2009-05-01 13 views
6

Üzerine yorum yapılabilen çeşitli nesneler içeren bir PHP uygulaması üzerinde çalışıyorum. Her yorum, kullanıcılara +1 veya -1 (Digg veya Reddit gibi) verebilecekleri şekilde oylanabilir. Şu anda, kullanıcı_kimliği ve oy bilgisini taşıyan bir 'oylar' tablosuna sahip olmayı planlıyorum.Oylama yapmak için en iyi yöntem oylama veritabanı yapısı

Buradaki her nesnenin, ayrı bir yorum tablosunda saklanan yüzlerce yorumu vardır. Yorumları yükledikten sonra oyları tweet atıyorum ve sonra tek tek oy verebildiklerinden emin olmak için her oyu kullanıcıya karşı tek tek kontrol ediyorum. Bu çalışır ancak sadece veritabanı yoğun görünüyor - sadece yorumlar için çok sorgular.

Bunu yapmanın daha basit bir yolu daha az DB yoğun mu? Güncel veritabanı yapmam gereken en iyi yol mu?

Yorumlar tablosu::

  • user_id
  • object_id
  • TOTAL_VOTES

Oy tablosu:

geçerli veritabanı yapısı hakkında daha net olmak gerekirse

  • comment_id
  • user_id
  • oy

Bitiş Hedef:

  • kullanıcı her yorumun MySQL sorguları az olan # üzerinde sadece bir kez oy vermelerine izin ver (her nesne birden fazla yoruma sahip)

cevap

8

Her oy verenin yalnızca bir kez oy verdiğinden emin olmak için, Oylar tablonuzu bu alanlar — CommentID, UserID, VoteValue ile tasarlayın. Bir kullanıcı sadece bir oy alır emin olmak için birincil anahtar, CommentID ve UserID yapın. Daha sonra, bir yorumun oylarını sorgulamak için aşağıdaki gibi bir şey yapın:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

Bu yardımcı olur mu?

+0

Bu gerçekten çok yardımcı olur, teşekkürler! İki ana tuşa sahip olmanın aklımı bile geçmediğini düşünmüştüm .. – mdolon

0

Neden her yorum için toplam oyları kaydetmiyorsunuz? Yeni bir oylama olduğunda bunu artırın/azaltın.

Ardından, kullanıcının bu yorum için kullanıcı başına yorum başına yalnızca bir oy kullanmasına izin verip oy vermediğini kontrol etmeniz gerekir.

+0

Bir kullanıcı, bu belirli yorum için oy kullandığını kontrol eden ikinci bölümdür - temel olarak ayrı bir oylama tablosuna sahip olmanızı sağlar. – mdolon

0

Geçerli nesne tarafından bu kullanıcı için yapılan yorumlardaki tüm oyları döndüren bir sql koşulu koşulu koyabilirsiniz, satır yoksa, kullanıcı oylamadı. Bu, her bir yorumu programda tek tek kontrol ettiğinizden biraz farklı. Veri tabanı yapısı söz konusu olduğunda, bu şeyleri ayrı tutmak mantıklıdır. oy kullan {user_id, object_id, object_type, vote_info ...)

Bunu zaten yapıyor olabilirsiniz, üzgünüm, ancak durum buysa, sizden yorum yapamadım.

İlgili konular