Kullanıcı kimliklerinin bir listesini depolamak için en iyi yöntem

2 Cevap php

Ben şu anda bir PHP / MySQL rating sistemi üzerinde çalışıyorum. Kullanıcı oranı edebilmek için kullanıcı Her kullanıcı benzersiz bir "UID" vardır oturum vardır. Orada (benim durumumda, her oyun için tek) sitesinde çoklu değerlendirme örneği olacak ve ben derecelendirme sistemi her örneği için değerlendirme tablosunda (MySQL satır bir MySQL satır UID'leri bir listesini depolamak için verimli bir yol gerekir ) olarak kim bir çetelesini tutmak için.

Ben liste tefrika PHP dizide saklanan diğer sistemlerde gördüm. Her zaman bir kullanıcı oy, daha sonra tefrika dizi, dizgilenmemiş ayıklanır vardır, yeni UID eklenir, dizi tefrika yeniden edilir ve MySQL satır güncellenir. Sayfa yüklendiğinde her zaman, bu liste bir kez daha dizgilenmemiş ve sayfayı görüntüleyen kullanıcı kullanıcı kez oy vermez emin olmak için henüz oy olup olmadığını görmek için kontrol edilmelidir.

Bu tür verimsiz ve hantal görünüyor. MySQL bu süreci daha verimli olmalarına yardımcı olacak liste fonksiyonu bir inşa var mı? Ben bu sorunu düzeltmek olabilir bir daha zeki bir yolu var mı?

Ben seri hale unutmak ve MySQL veritabanı bir metin türü alanında UID'leri saklamak olası tek alternatif olarak kabul ettik. Ben sadece her UID sonra bazı non-sayısal karakter (en bir dönem diyelim [.]) Eklemek istiyorum. Bir kullanıcı girişi eklemek için ben sadece METİN alanının ucuna UID birleştirmek ve daha sonra bir dönem olacaktır. Kullanıcı zaten ben sadece "FROM tablo WHERE oy = '.% $ UID%' SELECT *;" olabilir olarak eğer kontrol ederken. Bu daha verimli çalışmak veya işi almanın daha zarif bir yolu var mı istiyorsunuz?

Follow-up post about the table structure... Efficient MySQL table structure for rating system

2 Cevap

Bu verimsiz. Ne İlişkisel açısından burada sahip kullanıcılar ve oyun arasında çok-çok ilişkidir. Bir kullanıcı birçok oyun üzerinde oy verebilirsiniz. Bir oyun birçok kullanıcı tarafından oylanacak olabilir. Bunun için çözüm katılmak tablo sahip olmaktır:

USERS (uid, name, ...)
GAMES (gid, name, ...)
VOTES (id, uid, gid, ...)

Uid ve gid geri kendi tablolar için yabancı anahtarları nerede.

Birisi oyu verirse, REY bir kayıt eklemek.

Bir oyun için oy listesini almak için:

$get = mysql_query("SELECT * FROM votes WHERE gid = $game_id");
...

Kullanıcının oy listesini almak için:

$get = mysql_query("SELECT * FROM votes WHERE uid = $user_id");
...

ve benzerleri.

Bir dizi katılmak ve tek bir sütunda saklamayın. Bunu önlemek için haklısın.

Normalleştirilmiş bir veritabanı, bir kavşak tabloda saklamak gerekir:

UserRatings
-------------
RatingID int
UserID int
UserVote int

Ben senin sorguları ne olduğunu bilmiyorum. Uygulamaya bağlı olarak, bu kabul edilebilir bir performansa sahip olabilir. Ancak, her iki durumda da, ben normalize yaklaşımı, kriter ile gitmek önermek ve sadece uygunsa denormalize.