2010-12-09 12 views
15

Ich werde ein Abstimmungssystem für eine Webanwendung erstellen und mich fragen, wie der beste Weg wäre, die Abstimmungen in der (SQL) -Datenbank zu speichern.Datenbankstruktur für Abstimmungssystem mit Auf- und Abwärtsstimmen

Das Abstimmungssystem ähnelt dem von StackOverflow. Ich denke jetzt darüber nach, ob ich die Abstimmungen in verschiedenen Tabellen speichern soll. So ist es einfacher alle Ups zu zählen bzw. Stimmen runter. Auf der anderen Seite muss ich zwei Tabellen abfragen, um alle Stimmen für einen Benutzer oder einen gewählten Gegenstand zu finden.

Eine Alternative wäre eine Tabelle mit einem booleschen Feld, das angibt, ob diese Abstimmung eine Auf- oder Ab-Abstimmung ist. Aber ich denke, dass das Hoch- oder Herunterzählen der Stimmen ziemlich langsam ist (wenn Sie viele Stimmen haben), und ein Index für ein boolesches Feld (soweit ich weiß) macht keinen großen Sinn.

Wie würden Sie die Datenbankstruktur erstellen? Ein oder zwei Tische?

+0

Wenn Sie nur Stimmen auf Beiträge zählen, egal wer/wann/warum, würde ich ein Feld "Stimmen" in die Post-Tabelle setzen (wie kann man mehr als eine Stimme verhindern?). Wenn Sie Stimmen mit allen Details zählen müssen (wann, wer ...), brauchen Sie definitiv eine andere Tabelle. Und wenn Sie Stimmen für verschiedene Entitäten zählen (Beiträge, Kommentare, Videos), würde ich eine andere Tabelle hinzufügen (zB vote_type). –

+1

@Julio Wie können Sie feststellen, ob ein Benutzer bereits über einen bestimmten Beitrag abgestimmt hat? –

+0

@El Ronnoco Wie würde ich seine Spezifikationen kennen? Ich gebe nur verschiedene Wege. Mit den letzten beiden Lösungen können Sie. –

Antwort

15

die Ausführungen zu, fanden wir die Lösung, die am besten zu Zardoz passt

er nicht Stimmen zählen, immer will und so viele Informationen wie möglich benötigt. Die Lösung ist also eine Mischung aus beidem.

  1. Hinzufügen eines ganzzahligen Felds in der betrachteten Tabelle zum Speichern von Abstimmzählungen (stellen Sie sicher, dass keine Überläufe auftreten).
  2. Erstellen Sie zusätzliche Tabellen, die Stimmen einzuloggen (Benutzer, eine Anzeige, Datum, nach oben/unten, usw.)

Ich würde empfehlen, Trigger zu verwenden, um automatisch die ‚Stimmenauszählung Feld‘ zu aktualisieren, wenn das Einfügen/Löschen/Aktualisieren einer Abstimmung in der Protokolltabelle.

+0

+1 Guten Ruf auf die Trigger –

0

Sie erhalten eine Verknüpfungstabelle zwischen den Nutzern und den Entitäten müssen, die abgestimmt werden, würde ich gedacht. Auf diese Weise können Sie sehen, welche Nutzer bereits abgestimmt haben, und sie daran hindern, weitere Stimmen abzugeben. Die Tabelle kann in einem Boolean aufzeichnen, ob es sich um eine Auf- oder Ab-Abstimmung handelt.

Ich würde empfehlen, in der gewählten Entität ein aktuelles Stimmen-Tally-Feld zu speichern, um die Abfrage zu erleichtern. Die Einsparung in der Größe wäre vernachlässigbar, wenn Sie dies ausgelassen hätten.

11

Wenn Ihre Stimmen nur hoch/runter sind, können Sie eine votes Tabellenverknüpfung mit den Posts erstellen und einen Wert von 1 oder -1 (hoch/runter) haben. Auf diese Weise können Sie sum in einem einzigen gehen.

+0

Das klingt nett. Danke für den Vorschlag. – Zardoz

+0

+1 Schöne Idee mit der + 1/-1 add 'SUM' ming –

+0

erstellt dies nicht eine N + 1 Abfrage, da Sie eine N-mal (Abfrage Summe (Wert) von post_vote) abfragen müssen? Was denkst du über den Ansatz der akzeptierten Antworten? Ich arbeite selbst an so etwas und fragte mich, wie ich das machen sollte. – Jaigus