Ich arbeite an einer Abstimmungsseite und frage mich, wie ich mit Abstimmungen umgehen soll.
Zum Beispiel auf SO, wenn Sie für eine Frage (oder eine Antwort) stimmen, wird Ihre Stimme gespeichert, und jedes Mal, wenn ich wieder auf die Seite gehe, kann ich sehen, dass ich schon für diese Frage gestimmt habe, weil die Hoch / Runter-Taste farbig ist.
Wie machst du das? Ich meine, ich habe mehrere Ideen, aber ich frage mich, ob es eine schwere Last für die Datenbank sein wird.
Hier sind meine Ideen:
Schreiben Sie einen Helfer, der nach jeder Frage prüft, ob eine Stimme abgegeben wurde
Das bedeutet, dass die Anzahl der Abfragen von der Anzahl der auf der Seite angezeigten Elemente abhängt (normalerweise ~ 20)
Schleife auf meine Artikel erhalten die IDs und für jede Seite schreibe eine Abfrage, die zurückkommt, wenn eine Stimme geworfen wurde oder NULL
Sieht gut aus, da nur eine Abfrage unabhängig von der Anzahl der Elemente auf der Seite ist, aber möglicherweise ein MVC / Domain Model-Design bricht, weiß ich nicht.
Wenn sich ein Benutzer anmeldet (oder ein Gast, für den ein anonymer Benutzer erstellt wird) alle Abstimmungen abruft, speichert sie in der Sitzung, wenn eine neue Stimme abgegeben wird, fügen Sie sie einfach der Sitzung hinzu.
Sieht gut aus, da bis auf die erste keine Abfragen benötigt werden. Diese kann je nach der Anzahl der abgegebenen Stimmen (vielleicht ein Bündel für jeden Benutzer) die Größe der Sitzung für jede Person erhöhen Benutzer und möglicherweise die Authentifizierung verlangsamen.
Wie geht es dir? Irgendwelche anderen Ideen?
Zum Beispiel: Nehmen wir an, Sie haben eine Tabelle zum Speichern von Abstimmungen und den Benutzer, der sie abgegeben hat.
Nehmen wir an, Sie behalten die Stimmen in user_votes
, wenn eine Stimme mit einer Tabellenstruktur wie der unteren geworfen wird.
Jetzt, da der Benutzer angemeldet ist, schließen Sie sich bei der Abfrage der Fragen links mit der Benutzer-ID in der Tabelle user_votes
an.
Etwas wie
%Vor%In der Ansicht können Sie prüfen, ob die ID vorhanden ist. Wenn ja, stimme zu, sonst nicht.
Sie müssen möglicherweise Ihre Felder der Fragetabelle und alle ändern. Ich nehme an, Sie speichern Fragen in questions
Tabelle und Benutzer in user
Tabelle so und so. Alle haben den Primärschlüssel id
.
Danke
Sie könnten eine Kombination Ihrer vorgeschlagenen Strategien verwenden.
Abrufen aller vom angemeldeten Benutzer vorgenommenen Abstimmungen nur für aktuelle / aktive Fragen und Speichern dieser in der Sitzung.
Sie haben dann diejenigen, die mit größerer Wahrscheinlichkeit benötigt werden, während Sie immer noch die Menge reduzieren, die Sie in der Sitzung speichern müssen.
Im weniger wahrscheinlichen Fall, dass Sie andere Ergebnisse benötigen, können Sie nur nach Bedarf suchen.
Diese Strategie reduziert die Menge, die Sie in der Sitzung speichern müssen, und reduziert auch die Anzahl der Anrufe, die Sie an Ihre Datenbank richten.
Nur basierend auf den Informationen, die Sie bisher angegeben haben, würde ich den zweiten Ansatz wählen: Holen Sie sich die IDs aller Elemente auf der Seite und führen Sie dann eine einzige Abfrage durch, um alle Stimmen des Benutzers für diese Liste zu erhalten Artikel-IDs Übergeben Sie dann die Sammlung der Element-Votes des Benutzers an Ihre Ansicht, sodass Elemente anders gerendert werden können, wenn der Benutzer für dieses Element abgestimmt hat.
Die beiden anderen Ansätze scheinen eher weniger effizient zu sein, wenn ich Sie richtig verstehe. Wenn Sie mithilfe eines View-Helfers eine individuelle Abfrage für jedes Element initiieren, um zu überprüfen, ob der Benutzer über das Element abgestimmt hat, kann dies zu vielen unnötigen Abfragen führen. Und das Vorladen des gesamten Voting-Verlaufs des Benutzers bei der Anmeldung scheint unnötigen Overhead zu verursachen, Daten zu erhalten, die nicht immer benötigt werden, und die Last hinzuzufügen, sie für die Dauer der Sitzung aktuell zu halten.
Tags und Links session doctrine2 zend-framework vote