[pgsql-es-ayuda] Semi OT - Crear 1 tabla o 2?

2014-01-31 Por tema Conrado Blasetti
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?

2014-01-31 Por tema Omar Beltrán Cano

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

2014-01-31 Por tema Pedro PG
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 Por tema Jaime Casanova
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