[pgsql-es-ayuda] Semi OT - Crear 1 tabla o 2?
Gente, buenos días. Quisiera consultar lo siguiente. Necesito almacenar y gestionar ciertos datos. Se trata de información que va a trabajarse según el estado de un campo y cada registro posee aproximadamente 10 atributos mas, de distinto tipo (date, varchar, numeric...) La tabla tiene su pk con un campo serial. Ej: Table: test Id serial Estado smallint(1) not null -CAMPO A TRATAR Campo1 Campo2 CampoN El campo "estado" es 1,2,3,4 o 0 (cero). Posiblemente en algún futuro se agreguen otros estados "5", "6", etc. Este campo nace en 1 y luego pasa al resto de estado. Cuando llega al estado 4, el próximo estado es 0 (cero) que sería la identificación del registro para interpretar la "historia" o que ya fue tratado y se lo explotará en conjunto con otros campos. Ej. "estado" = 0 and "cliente" = 'PEPE' (solo listados, no interactivo) Las búsquedas "interactivas" y de gestión simultanea (varias terminales) en esta tabla serán solamente por el campo "estado", 1,2,3 o 4. La tabla va a crecer en 20 mil registros por mes aproximadamente. El registro nace en estado "1", a los 10 minutos (dependiendo la gestión) pasa a estado "2" (update) El registro en estado "2" a los 10 minutos (dependiendo la gestión) pasa a estado "3" (update) El registro en estado "3" a los 10 minutos (dependiendo la gestión) pasa a estado "4" (update) El registro en estado "4" a los 10 minutos (dependiendo la gestión) pasa a estado "0" (update) Si no se generan registros en 1h, posiblemente todos los registros de la tabla tendrán el estado "0" hasta que se genere un nuevo registro. Cada 30 segundos debo ejecutar 4 consultas. Una consulta para cada estado (1,2,3, y 4) Cabe aclarar que el resto de atributos de esta tabla, también se actualizaran en cada paso de estado La consulta final es, como me convendría gestionar los datos? 1- Creo la tabla directamente con todos los datos y ejecuto las consultas de forma tradicional? Select * from table where estado = 1? 2- Creo una tabla con id y estado donde se hagan los insert y update esenciales y luego una segunda tabla donde tenga el resto de atributos para joinearla con el id de la tabla "cabecera"? 3- Me conviene hacer "delete" de los campos es estado 0 (o sea, luego del estado 4) e insertarlos en una tabla consolidada? 4- Aclaro que el mantenimiento de la bd no será diario por la gestión (24x7), autovaccum activado Bueno, cualquier sugerencia, a disposición. Saludos, Conrado PD: PostgreSQL: 9.3 Version string: PostgreSQL 9.3.1, compiled by Visual C++ build 1600, 32-bit SO: Windows. Desarrollar : C# .NET (Npgsql y Mono)
Re: [pgsql-es-ayuda] Semi OT - Crear 1 tabla o 2?
Hola a todos.. Bueno Conrado, "cada quien tiene su forma de matar las pulgas" dicen por ahí Yo lo que haría sería manejar un particionamiento de tablas ( http://www.postgresql.org/docs/9.3/static/ddl-partitioning.html ) basado en el estado que comentas, para que así cada estado tenga su propia tabla, y la base de datos lo haga de forma automática. Recuerda que es importante tener indexados los campos, y en la medida de lo posible, que esos índices se encuentren en discos aparte, ojalá discos scsi, y si pudieras hacer lo mismo con las tablas, sería lo mejor. Un abrazo a todos desde Colombia. Omar El 31/01/14 08:43, Conrado Blasetti escribió: Gente, buenos días. Quisiera consultar lo siguiente. Necesito almacenar y gestionar ciertos datos. Se trata de información que va a trabajarse según el estado de un campo y cada registro posee aproximadamente 10 atributos mas, de distinto tipo (date, varchar, numeric...) La tabla tiene su pk con un campo serial. Ej: Table: test Id serial Estado smallint(1) not null --CAMPO A TRATAR Campo1 Campo2 CampoN El campo "estado" es 1,2,3,4 o 0 (cero). Posiblemente en algún futuro se agreguen otros estados "5", "6", etc. Este campo nace en 1 y luego pasa al resto de estado. Cuando llega al estado 4, el próximo estado es 0 (cero) que sería la identificación del registro para interpretar la "historia" o que ya fue tratado y se lo explotará en conjunto con otros campos. Ej. "estado" = 0 and "cliente" = 'PEPE' (solo listados, no interactivo) Las búsquedas "interactivas" y de gestión simultanea (varias terminales) en esta tabla serán solamente por el campo "estado", 1,2,3 o 4. La tabla va a crecer en 20 mil registros por mes aproximadamente. El registro nace en estado "1", a los 10 minutos (dependiendo la gestión) pasa a estado "2" (update) El registro en estado "2" a los 10 minutos (dependiendo la gestión) pasa a estado "3" (update) El registro en estado "3" a los 10 minutos (dependiendo la gestión) pasa a estado "4" (update) El registro en estado "4" a los 10 minutos (dependiendo la gestión) pasa a estado "0" (update) Si no se generan registros en 1h, posiblemente todos los registros de la tabla tendrán el estado "0" hasta que se genere un nuevo registro. Cada 30 segundos debo ejecutar 4 consultas. Una consulta para cada estado (1,2,3, y 4) Cabe aclarar que el resto de atributos de esta tabla, también se actualizaran en cada paso de estado La consulta final es, como me convendría gestionar los datos? 1-Creo la tabla directamente con todos los datos y ejecuto las consultas de forma tradicional? Select * from table where estado = 1? 2-Creo una tabla con id y estado donde se hagan los insert y update esenciales y luego una segunda tabla donde tenga el resto de atributos para joinearla con el id de la tabla "cabecera"? 3-Me conviene hacer "delete" de los campos es estado 0 (o sea, luego del estado 4) e insertarlos en una tabla consolidada? 4-Aclaro que el mantenimiento de la bd no será diario por la gestión (24x7), autovaccum activado Bueno, cualquier sugerencia, a disposición. Saludos, Conrado PD: PostgreSQL: 9.3 Version string: PostgreSQL 9.3.1, compiled by Visual C++ build 1600, 32-bit SO: Windows. Desarrollar : C# .NET (Npgsql y Mono)
[pgsql-es-ayuda] Personalizar SQLERRM
Buen día lista, pues bien, deseo personalizar los mensajes de error que genera el postgresql, por ejemplo: Cree una restricción única a una combinación de 3 campos, en una función hago la inserción de la tabla en cuestión y en el bloque EXCEPTION capturo todos los errores: EXCEPTION WHENothers THENraise notice '%', SQLERRM;END; Cuando se repite la unicidad gracias a esta instrucción me muestra el siguiente mensaje: llave duplicada viola restricción de unicidad «cuk__venta___comprobante» Lo que deseo saber es: como es que se arma este mensaje, de que tabla saca el texto llave duplicada viola restricción de unicidad, debo hacer una función que registre al detalle las excepciones. PD: No deseo personalizar el mensaje con la instrucción: RAISE EXCEPTION USING ERRCODE = "etc", MESSAGE = "etc"; Gracias desde ya.Saludos.
Re: [pgsql-es-ayuda] Personalizar SQLERRM
2014-01-31 Pedro PG : > > llave duplicada viola restricción de unicidad «cuk__venta___comprobante» > > Lo que deseo saber es: como es que se arma este mensaje, de que tabla saca > el texto llave duplicada viola restricción de unicidad, Saludos, El mensaje no sale de una tabla sino que esta en el código fuente de PostgreSQL: el mensaje original está en src/backend/access/nbtree/nbtinsert.c (línea 392) y la traducción al español en src/backend/po/es.po (línea 467) > debo hacer una > función que registre al detalle las excepciones. > > PD: No deseo personalizar el mensaje con la instrucción: > > RAISE EXCEPTION USING ERRCODE = "etc", MESSAGE = "etc"; > por que? -- Jaime Casanova www.2ndQuadrant.com Professional PostgreSQL: Soporte 24x7 y capacitación Phone: +593 4 5107566 Cell: +593 987171157 - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda