2012-06-05 2 views
6

Die Grundlagen von MongoDB-Capped-Sammlungen sind, dass Sie die maximale Größe der Tabelle festlegen können und das System alte Daten löscht, wenn das Größenlimit erreicht ist.MongoDB Capped-Kollektionsäquivalent in PostgreSQL

Hat jemand das ähnliche Setup in PostgreSQL gefunden und in der Produktion verwendet?

+1

Partitionierung Implementieren und programmatisch die älteren Partitionen löschen und nur halten die jüngste funktionieren könnte. Theoretisch sollte es viel besser funktionieren als das Löschen von Zeilen aus der Tabelle. – Marquez

Antwort

3

Ich habe nichts davon gehört. Ich denke, Sie mit einer verkappten Tabellengröße oder zirkuläre Warteschlange simulieren könnten:

Besonders interessant (aus meiner Sicht) ist die Reaktion der Rinder (dh die nicht akzeptierten Antworten zu sehen).

Mit der Einführung von einer Spalte zu der Tabelle mit dem Index in die „Collection“, und eine Sequenz für die Spalte zu repräsentieren, kann jede Upsert unter der Bedingung, basieren:

where index = (sequence.nextval % max collection size) 
+4

tatsächlich, machen Sie einfach die Sequenz einen CYCLE-Wert der maximalen Sammlungsgröße. Auf diese Weise können Sie einen upsert-Trigger verwenden, der nur nextval übernimmt und das update/insert-Objekt ausführt. – reedstrm

3

Dies ist eine einfache Lösung, in Fällen, in denen die Datengröße nicht zu groß ist und die Leistungsanforderungen nicht zu hoch sind.

Zuerst erstellen wir unsere Tabelle. Wir werden eine ID-Spalte und eine Datenspalte haben, aber Sie können Spalten haben, die Sie für Ihre spezielle Situation benötigen.

CREATE TABLE capped_collection (
    id integer NOT NULL, 
    data text); 

Jetzt erstellen wir eine Sequenz, die für unsere Primärschlüssel, stellen Sie die MAXVALUE die gewünschte Größe unserer capped Sammlung zu sein, und wir nutzen die CYCLE Option, so dass die Sequenz bis zu MAXVALUE zählen und dann Neustart bei wieder 1.

CREATE SEQUENCE capped_collection_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    MINVALUE 1 
    MAXVALUE 10000 
    CACHE 1 
    CYCLE 
    OWNED BY capped_collection.id; 

im nächsten Schritt (hier nicht dargestellt), sollten Sie die Tabelle mit MAXVALUE Aufzeichnungen Vorkeimdaten. Wir machen das so, dass jeder ID-Wert eine Zeile hat und wir uns keine Gedanken darüber machen müssen, ob wir eine INSERT- oder UPDATE-Operation ausführen sollen, nur um die Dinge einfach und leistungsfähig zu halten.

Nun, da unser Tisch eingerichtet ist, wenn wir eine neue Zeile einfügen wollen, müssen wir stattdessen wie ein UPDATE tun so

UPDATE capped_collection 
SET data = 'your data here' 
WHERE id = (SELECT nextval('capped_collection_id_seq')) 

Der nextval Befehl ruft uns die nächste id, und weil wir es angegeben CYCLE wird um 1 zurückgehen, sobald es MAXVALUE erreicht. Das Endergebnis ist, dass Sie nur MAXVALUE Zeilen in der Tabelle haben werden, wobei die ältesten Einträge ausgeklammert werden.

(von http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/)