2017-03-24 3 views
1

Ich habe eine Tabelle mit etwa 10.000 Benutzern. Ich möchte die Top 10 sehen, sortiert nach score, und Echtzeit-Updates geben, wann immer sich die Zusammensetzung der Liste ändert oder sich eines der Ergebnisse der Top 10 ändert.Postgres-Trigger, wenn irgendeine der "obersten" Zeilen geändert wird

Was ist der beste Weg, dies mit einem Trigger zu tun, und wird dies ein sehr teurer Auslöser sein, um weiter zu laufen?

Antwort

0

Solange Sie einen Index für score haben, wäre es billig sein FOR EACH ROW eine AFTER UPDATE Trigger zu haben, die enthält:

IF (SELECT count(*) 
    FROM (SELECT 1 
      FROM users 
      WHERE score > NEW.score 
      LIMIT 10 
     ) top_users 
    ) < 10 
    OR 
    (SELECT count(*) 
    FROM (SELECT 1 
      FROM users 
      WHERE score > OLD.score 
      LIMIT 10 
     ) top_users 
    ) < 10 
THEN 
    /* your action here */ 
END IF; 

Sie auch einen DELETE Trigger bräuchten, die nur den zweiten Teil der enthält Abfrage und ein INSERT Trigger mit nur dem ersten Teil.

Das Problem, das ich hier sehe, ist /* your action here */.
Dies sollte eine kurze Operation sein, wie das Hinzufügen von etwas zu einer Warteschlange, sonst könnten Sie mit langen Transaktionen und langen Sperren enden.

+0

Wie verbinde ich die Daten mit dem Rückgabeverfahren? Um beispielsweise eine Zeile zu senden, verwende ich 'FOR EACH ROW EXECUTE PROCEDURE' in der Anweisung' CREATE TRIGGER'. Ist das das Problem, das du mit '/ * deiner Aktion hier identifiziert hast? * /? Ich bin neu bei Postgres, also je mehr Details Sie bereitstellen können, desto besser. –

+0

Ja, es wäre ein "FÜR JEDE REIHE" Trigger. Mein Zweifel war, dass ich nicht weiß, was Sie im Auslöser vorhaben. Es sollte nichts sein, was - sagen wir - synchron eine Aktualisierung im Frontend initiiert. Was meinst du mit * verbinde die Daten mit dem Rückgabeverfahren *? –

Verwandte Themen