Il miglior metodo per memorizzare un elenco di ID utente

Sto lavorando su un sistema di valutazione PHP / MySQL in questo momento. Affinché l'utente possa valutare l'utente deve effettuare il login. Ogni utente ha un "UID" univoco. Ci saranno più istanze di rating sul sito web (una per each gioco, nel mio caso) e ho bisogno di un modo efficiente di memorizzare una list di UID in una row MySQL (una row MySQL nella tabella delle classifiche per each istanza del sistema di valutazione ) per tenere un conto di chi ha votato.

Ho visto in altri sisthemes che la list è memorizzata in un arrays PHP serializzato. Ogni volta che un utente vota, l'arrays serializzato deve essere estratto, non serializzato, viene inserito il nuovo UID, l'arrays viene ricalibrato e la row MySQL è UPDATEd. Ogni volta che la pagina viene caricata, tale elenco deve essere nuovamente non serializzato e controllato per vedere se l'utente che ha visualizzato la pagina ha ancora votato per assicurarsi che l'utente non voti due volte.

Questo sembra inefficiente e ingombrante. MySQL ha una function di list incorporata per aiutare questo process ad essere più efficiente? Ci sono modi più intelligenti per risolvere questo problema?

Ho preso in considerazione una ansible alternativa che dimentica la serializzazione e l'archiviazione degli UID in un field di tipo TEXT nel database MySQL. Aggiungerei semplicemente un carattere non numbersco dopo each UID (diciamo un punto [.]). Per aggiungere una voce utente, vorrei semplicemente concatenare l'UID alla fine del field TESTO e quindi un punto. Quando controllo se l'utente ha già votato, potrei semplicemente "SELECT * FROM table WHERE votes = '% $ UID.%';". Funzionerebbe in modo più efficiente o c'è un modo più elegante per portre a termine il lavoro?

Post successivo sulla struttura della tabella … Struttura della tabella MySQL efficiente per il sistema di valutazione

È inefficiente Quello che hai qui in termini relazionali è una relazione molti-a-molti tra utenti e giochi. Un utente può votare su molti giochi. Un gioco può essere votato da molti utenti. La soluzione per questo è avere una tabella di join:

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

Dove uid e gid sono chiavi esterne alle rispettive tabelle.

Se qualcuno vota, inserisci un record in VOTES.

Per get un elenco di voti per una partita:

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

Per get un elenco dei voti dell'utente:

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

e così via.

Non unire un arrays e memorizzarlo in una singola colonna. Hai ragione di evitarlo.

In un database normalizzato, è necessario memorizzarlo in una tabella di giunzione:

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

Non so quali sono le tue domande. A seconda dell'applicazione, questo potrebbe non avere le performance accettabili. Tuttavia, in entrambi i casi, suggerisco di seguire l'approccio normalizzato, il benchmark e denormalizzare solo se appropriato.