2012-06-05 20 views
6

Lo básico de las colecciones con límites MongoDB es que le permiten establecer el tamaño máximo de la tabla y el sistema borrará los datos antiguos cuando se alcance el límite de tamaño.MongoDB Cobertura equivalente en PostgreSQL

¿Alguien ha ideado la configuración similar en PostgreSQL y la ha utilizado en producción?

+1

Implementar la separación y la programación dejando caer las particiones de más edad y sólo mantener el más reciente podría funcionar. Teóricamente debería funcionar mucho mejor que eliminar filas de la tabla. – Marquez

Respuesta

3

No he oído hablar de nada de eso. Creo que se puede simular un tamaño de la tabla tapado o cola circular mediante el uso de:

Especialmente interesante (desde mi punto de vista) es la respuesta de bovino (es decir, mira las respuestas no aceptadas).

Con la introducción de una columna a la tabla para representar el índice en la "colección" y una secuencia para la columna, cada upsert puede basarse en la condición:

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

en realidad, solo haga que la secuencia tenga un valor de CICLO del tamaño de recopilación máximo. Esto le permite usar un activador de inserción que simplemente toma la próximaval y actualiza/inserta algo. – reedstrm

3

Aquí es una solución simple a esto, para casos donde el tamaño de los datos no es demasiado grande y los requisitos de rendimiento no son demasiado difíciles.

Primero, creemos nuestra tabla. Vamos a tener una columna de identificación y una columna de datos, pero puede tener las columnas que necesite para su situación particular.

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

Ahora, creamos una secuencia para nuestra clave primaria, fijamos el MAXVALUE ser el tamaño deseado de la colección de cubiertas, y usamos la opción CYCLE, por lo que la secuencia contará hasta MAXVALUE y reinicie de nuevo 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; 

en el siguiente paso (no mostrado aquí), que debe pre-semilla de la mesa con MAXVALUE registros. Hacemos esto para que cada valor de identificación tenga una fila, y no tenemos que preocuparnos de decidir si hacemos una operación INSERTAR o ACTUALIZAR, solo para mantener las cosas simples y efectivas.

Ahora que la mesa está configurado, cada vez que desee insertar una nueva fila, que en cambio realiza una actualización al igual que

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

El comando nextval no nos lleva a la siguiente identificación, y porque especificamos CYCLE se se ajustará nuevamente a 1 una vez que llegue a MAXVALUE. El resultado final es que solo tendrá MAXVALUE filas en la tabla, con las entradas más antiguas con antigüedad.

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

Cuestiones relacionadas