2009-07-27 6 views
2

Wenn wir auf die Stackoverflow-Website schauen, haben wir Stimmen. Aber die Frage ist, was ist der beste Weg zu speichern, wer gewählt hat und wer nicht. Lasst uns das auch noch vereinfachen und sagen, dass wir nur Up wählen können, und wir können nur die Up-Abstimmung entfernen.Bewertungssystem in PHP und MySQL

Ich dachte, die Tabelle mit in einer solchen Form zu sein

question - Id(INT) | userId(INT) | title(TEXT) | vote(INT) | ratedBy(TEXT)

Thre Rest Selbstexplanitory ist aber Neuesteam ist ein Comma Separated Id-Werte der Benutzer.

Ich dachte, das Neuesteam und vergleicht ihn mit dem userId der aktuellen angemeldeten Benutzer zu lesen. Wenn er in der ratedby besteht kann er abstimmen, sonst kann er seine Stimme entfernen. Welches wiederum wird den Wert von ratedby

+0

Wenn dies zuvor diskutiert wurde, umleiten mich PLZ: D –

Antwort

5

Ich denke, um eine andere Tabelle "Abstimmung" ist besser. Die Beziehung zwischen Benutzern und Stimmen ist n zu n, daher sollte eine neue Tabelle erstellt werden. Es sollte wie folgt sein:

question id (int) | user id (int) | permanent (bool) | timestamp (datetime) 

Permanent Feld verwendet werden kann, um Stimmen nach einer bestimmten Zeit bleiben zu machen, wie es so tut.
Weitere Felder können je nach den gewünschten Funktionen hinzugefügt werden. Da jede Zeile mindestens 16B benötigt, können Sie bis zu 250 Millionen Zeilen in der Tabelle haben, bevor die Tabelle 4GB verwendet (Fat32-Limit, wenn es ein Archiv pro Tabelle gibt, was bei MyISAM und InnoDB der Fall ist).
Auch, wie Matthew Scharley in einem Kommentar darauf hinweist, laden Sie nicht alle Stimmen auf einmal in den Speicher (wie alle Tabelle in einer Ergebnismenge abrufen). Sie können die LIMIT-Klausel immer verwenden, um die Abfrageergebnisse einzuschränken.

+0

Aber das lässt die Frage, das ist eine sehr große Tabelle im Laufe der Zeit –

+3

Und? Ich habe vorher mit mehreren Millionen Record (Logging) -Tabellen gearbeitet. Solange Ihr Tisch * gut entworfen ist * (liest: indiziert, anders als dieser Logging-Tisch war zuerst ... Uggh.) Wird es nicht (zu) langsam sein. –

+1

cool, nur bestätigt. Ich indexiere die userId und questionId und mache sie beide zu Primärschlüsseln. Auf diese Weise denke ich, dass ich die Kontrolle vermeiden kann: D –

0

Ich glaube, Ihr Design wird nicht in der Lage sein, für eine große Anzahl von Wählern zu skalieren. Das Erstellen von Tabellen ist normalerweise

Tabelle 1: Frage - Id (INT) | userId (INT) | Titel (TEXT)
Tabelle 2: Frage - ID (INT) | Abstimmung (INT) | Neuesteam (TEXT)

Dann können Sie die Stimmen mit einer Abfrage wie folgt zählen:

SELECT t1.question_Id, t1.userId, t1.title, t2.sum(vote) 
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.question_id = t2.question_id 
+0

Würden Sie sagen, dass das Erstellen von zwei Tabellen zum Verknüpfen der Stimmen immer schneller ist als das Verarbeiten von Text? –

+0

Meine bisherigen Erfahrungen, vor allem mit mysql und Oracle, sind, dass Datenbanken besser mit Tabellen und Joins umgehen können. Zusätzlich können Sie Indizes hinzufügen, mit denen Sie schneller aggregieren (die Summe der Stimmen erhalten) und überprüfen können, ob ein Benutzer bereits für eine bestimmte Frage gestimmt hat. Die Datenbank überprüft den Index und geht direkt zu der/den entsprechenden Zeile (n), ohne den Rest der Daten zu berücksichtigen. Sie sollten jedoch beachten, dass Sie, um Unterschiede zwischen den beiden Ansätzen zu erkennen, eine große Anzahl von Stimmen pro Frage benötigen (einige Tausend und mehr). – Evangelos

2

eine neue Tabelle:

Artikel-ID | Benutzer-ID | Bewertung

Wo Artikel-ID und Benutzer-ID den zusammengesetzten Schlüssel bilden, und Bewertung wäre 1, Upvote, -1 für einen Downvote und 0 für eine entfernte Abstimmung (oder einfach entfernen Sie die Zeile).