2012-06-05 9 views
6

Le basi delle raccolte con limite MongoDB sono che consentono di impostare la dimensione massima della tabella e il sistema cancella i vecchi dati quando viene raggiunto il limite di dimensione.MongoDB Equivalente della collezione Capped in PostgreSQL

Qualcuno ha ideato il setup simile in PostgreSQL e lo ha utilizzato in produzione?

+1

Implementare il partizionamento e far cadere a livello di codice le partizioni più grandi e solo mantenendo il più recente potrebbe funzionare. In teoria dovrebbe funzionare in modo migliore dell'eliminazione di righe dalla tabella. – Marquez

risposta

3

Non ho mai sentito nulla del genere. Credo che si potrebbe simulare una dimensione della tabella innevate o coda circolare utilizzando:

Particolarmente interessante (dal mio punto di vista) è la risposta di bovino (cioè guarda le risposte non accettate).

Con l'introduzione di una colonna alla tabella per rappresentare l'indice nella "collezione" e una sequenza per la colonna, ciascuna upsert può essere basata sulla condizione:

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

, in realtà, basta che la sequenza abbia un valore CICLO della dimensione massima della raccolta. Questo ti permette di usare un trigger di upsert che prende solo il nextval e fa l'update/insert thing. – reedstrm

3

Ecco una soluzione semplice a questo, per i casi in cui la dimensione dei dati non è troppo grande e i requisiti di prestazione non sono troppo difficili.

In primo luogo, creiamo il nostro tavolo. Avremo una colonna id e una colonna di dati, ma puoi avere le colonne necessarie per la tua situazione specifica.

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

Ora, creiamo una sequenza per la nostra chiave primaria, impostare il MAXVALUE essere la dimensione desiderata della nostra collezione innevate, e usiamo l'opzione CYCLE, in modo che la sequenza conterà fino a MAXVALUE e poi riavviare di nuovo a 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; 

Nella fase successiva (non mostrato qui), si dovrebbe pre-seed tavolo con MAXVALUE record. Lo facciamo in modo che ogni valore id abbia una riga e non dobbiamo preoccuparci di decidere se eseguire un'operazione INSERT o UPDATE, solo per mantenere le cose semplici e performanti.

Ora che il nostro tavolo è impostato, ogni volta che vogliamo inserire una nuova riga, che invece fa un aggiornamento in questo modo

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

Il comando nextval ci porta alla prossima id, e perché abbiamo specificato CYCLE esso tornerà indietro a 1 una volta che raggiunge MAXVALUE. Il risultato finale è che avrai sempre solo MAXVALUE righe nella tabella, con le voci più vecchie che sono invecchiate.

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