Ich arbeite gerade an einem PHP/MySQL-Bewertungssystem. Damit der Benutzer bewerten kann, muss sich der Benutzer anmelden. Jeder Benutzer hat eine eindeutige "UID". Es wird mehrere Bewertungsinstanzen auf der Website geben (eine für jedes Spiel in meinem Fall) und ich brauche eine effiziente Möglichkeit, eine Liste von UIDs in einer MySQL-Zeile zu speichern (eine MySQL-Zeile in der Bewertungstabelle für jede Instanz des Bewertungssystems)) um eine Übersicht zu halten, wer gewählt hat.Beste Methode zum Speichern einer Liste von Benutzer-IDs
Ich habe in anderen Systemen gesehen, dass die Liste in einem serialisierten PHP-Array gespeichert ist. Jedes Mal, wenn ein Benutzer abstimmt, muss das serialisierte Array extrahiert, unserialisiert werden, die neue UID wird eingefügt, das Array wird erneut serialisiert und die MySQL-Zeile wird UPDATEd. Jedes Mal, wenn die Seite geladen wird, muss diese Liste erneut unserialisiert und überprüft werden, um zu sehen, ob der Benutzer, der die Seite anschaut, noch abgestimmt hat, um sicherzustellen, dass der Benutzer nicht zweimal abstimmt.
Dies scheint irgendwie ineffizient und umständlich. Hat MySQL eine integrierte Listenfunktion, um diesen Prozess effizienter zu gestalten? Gibt es cleverere Möglichkeiten, dieses Problem zu beheben?
Ich habe eine mögliche Alternative erwogen, die das Serialisieren vergisst und die UIDs in einem TEXT-Feld in der MySQL-Datenbank speichert. Ich würde einfach nach jeder UID ein nicht-numerisches Zeichen anhängen (sagen wir ein Punkt [.]). Um einen Benutzereintrag hinzuzufügen, würde ich einfach die UID am Ende des TEXT-Felds und dann einen Punkt verketten. Bei der Überprüfung, ob der Benutzer bereits gewählt hat, könnte ich einfach "SELECT * FROM Tabelle WHERE votes = '% $ UID.%';". Würde dies effizienter funktionieren oder gibt es einen eleganteren Weg, die Arbeit zu erledigen?
Follow-up-Post über die Tabellenstruktur ... Efficient MySQL table structure for rating system
Es scheint, dass Sie und Mehrdad den gleichen Ansatz vorschlagen. Ich mache es so. Mein einziges Anliegen ist die Größe der VOTES-Tabelle. Es wäre denkbar, dass <# Spiele x # Nutzer> in dieser Tabelle stimmen würden. Sollte mich das zu meinem Shared Hosting Plan Administrator machen? –
Realistisch gesehen muss eine Tabellengröße in die Millionen gehen, bevor Sie überhaupt eine "Partitionierung" in Betracht ziehen müssen (im Grunde die Daten aufteilen). Der Ansatz, ein Array zu implodieren, wird zwar Zeilen, aber deutlich mehr Overhead für das Lesen und Schreiben haben. – cletus
Wenn Sie die oben aufgeführten Abfragen ausführen, stellen Sie sicher, dass Sie die Tabelle mit * bid * uid und gid indizieren, um die Abfragen schnell zu machen. Das ist der größte Nachteil dieses Ansatzes: Sie benötigen mehrere Indizes. – slacy