2016-05-08 5 views
0

Ich habe eine Frage und Antwort Website (so etwas wie SO). Ich möchte diesen Zustand implementieren:Überprüfen der Benutzer-Reputation von PHP vs MySQL

Zustand: Ein Benutzer kann eine Abstimmung nach unten geben, die mindestens 125 reputatoin hat.

Nun kann ich diesen Zustand auf zwei Arten realisieren:

Server Side: Wenn Benutzer anmelden, ich seinen Ruf bekommen und es in $_SESSION['rep'] gesetzt. Benutzen Sie diese dann vor kommentieren

if($_SESSION['rep'] >= 125) { /* can vote */ } else { /* cannot vote */ } 

Datenbank Side: Ich kann einen Trigger verwenden und überprüfen Sie es wie folgt aus:

IF (SELECT 1 FROM user WHERE id = new.user_id AND rep < 125) THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "cannot vote"; 
END if;` 

ich beide getestet haben und sie arbeiten als Gut. Jetzt möchte ich wissen, welches ist häufiger und Standard?

Antwort

1

Persönlich habe ich die Datenbank-Side-Approach die ganze Zeit (nicht mit einem Trigger, sondern durch Abfragen der Datenbank vor dem Kommentieren und Überprüfen der Reputation des Benutzers in PHP). Es wird die Leistung nicht zu sehr verlangsamen.

Wenn Sie jedoch die Leistung wirklich benötigen, können Sie die Benutzerreputation im Speicher zwischenspeichern (verwenden Sie nicht $ _SESSION, dies führt leicht zu Inkonsistenzproblemen). Was ist mit Redis/Memcached? Wenn sich der Benutzer anmeldet, stelle seinen Ruf in den Cache. Wenn die Reputation des Benutzers in der Datenbank aktualisiert wird, muss der Cache ebenfalls aktualisiert (ungültig gemacht) werden. Wenn Sie herausfinden müssen, ob der Benutzer die Berechtigung zum Abstimmen hat, müssen Sie nur Ihren Cache konsultieren, keine Datenbankabfrage beteiligt.

P.S. Der Schlüssel des Cache sollte wie folgt aussehen: user_rep_5 (wobei 5 die Benutzer-ID ist), nicht user_rep_xxxx (wobei xxxx die Sitzungs-ID ist). Ich meine, der Cache sollte global erfolgen, um sicherzustellen, dass es nur eine einzige Wahrheitsquelle gibt, anstatt sie mit der Sitzung zu verknüpfen.

+0

Danke .. upvote – Shafizadeh

+0

Es gibt keine Notwendigkeit, zuerst zu überprüfen. Sie können INSERT überprüfen, wodurch eine Reise in die Datenbank gespeichert wird.Aber es geht wirklich darum, das Nutzererlebnis so zu gestalten, wie Sie es möchten - vielleicht ist der Abstimmknopf also ausgegraut oder unsichtbar, bis der Wiederholer erreicht ist. – Strawberry

+0

@Strawberry yeah wenn du dich nicht um die Benutzererfahrung kümmerst (Ausgrauen/Verstecken der Schaltfläche) überprüfe einfach, bevor du einfügst Ich stimme zu – Kevin

-2

Tun Sie es auf der Serverseite ist eine bessere Option. Sie können seinen Ruf erhalten, wenn sich der Benutzer anmeldet und nur validieren muss, bevor er antwortet.

Wenn Sie dies auf der Datenbankseite tun, führen Sie einen zusätzlichen Aufruf aus, wodurch der Benutzer auf die Antwort vom DB Server wartet. Dies wird dich verlangsamen.

+0

Ich stimme nicht zu. Denn wenn der Benutzer mehr als 125 Rep und Logs hat und dann alle seine Rep verlieren, kann er immer noch Downvote geben, weil sich '$ _SESSION ['rep']' nicht ändert. – stack

0

Vor diesem Schritt

if($_SESSION['rep'] >= 125) { /* can vote */ } else { /* cannot vote */ } 

Es ist besser, wenn Sie $_SESSION['rep'] aktualisieren und mit diesem aktualisierten Ruf geprüft.

+0

Warum also nicht 'TRIGGER'? Ich kann es mit einem 'TRIGGER' überprüfen, anstatt * zu aktualisieren * und mit PHP zu überprüfen. – Shafizadeh