Re: Ayuda con inquietud

From: Jorge Toro <jolthgs(at)gmail(dot)com>
To: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Ayuda con inquietud
Date: 2012-07-11 20:23:58
Message-ID: CAK0+Q89KYgYQWgnkM4dfkuHWbgZRkm7YtKqz_Z+K+6O594pCMQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos y gracias por la ayuda que me prestaron para resolver mis
inquietudes.

Para resolver el problema me decidí tomar lo mejor de todo lo propuesto y
hace lo siguiente:

CREATE TABLE gps(
id serial PRIMARY KEY,
name varchar(10) NOT NULL UNIQUE,
type integer,
active boolean default 'f',
FOREIGN KEY (type) REFERENCES type_gps(codigo) MATCH FULL on delete
cascade on update cascade
);

CREATE INDEX gps_name_index ON gps(name); -- Para las busquedas por nombre.

CREATE TABLE positions_gps(
id serial PRIMARY KEY,
gps_id integer REFERENCES gps(id) MATCH FULL on delete cascade on update
cascade,
position point NOT NULL,
velocidad real,
altura real,
grados real,
satelites smallint,
address varchar(100),
fecha timestamp with time zone NOT NULL
);

CREATE TABLE last_positions_gps(
id integer NOT NULL UNIQUE,
gps_id integer NOT NULL,
position point NOT NULL,
velocidad real,
altura real,
grados real,
satelites smallint,
address varchar(100),
fecha timestamp with time zone NOT NULL,
CONSTRAINT last_positions_gps_pkey PRIMARY KEY (gps_id)
);

CREATE INDEX positions_gps_gpsidfecha_index ON positions_gps(gps_id,
fecha); -- para realizar busquedas por fechas para un determinado gps.

CREATE OR REPLACE FUNCTION ingresar_last_positions_gsp() RETURNS trigger AS
$body$
DECLARE
result boolean;
BEGIN

SELECT INTO result active FROM gps WHERE id=NEW.gps_id and active='t';
IF NOT FOUND THEN
RETURN NULL;
END IF;

UPDATE last_positions_gps SET(
id,
position,
velocidad,
altura,
grados,
satelites,
address,
fecha) = ( NEW.id, NEW.position, NEW.velocidad, NEW.altura,
NEW.grados, NEW.satelites, NEW.address, NEW.fecha)
WHERE gps_id = NEW.gps_id and fecha < NEW.fecha;

IF not found THEN
INSERT INTO last_positions_gps VALUES (NEW.*);
END IF;

RETURN NEW;

END;
$body$ LANGUAGE plpgsql;

CREATE TRIGGER ingresar_last_positions_gsp BEFORE INSERT ON positions_gps
FOR EACH ROW EXECUTE PROCEDURE ingresar_last_positions_gsp();

Si tienen algún aporte estoy presto, gracias!

Cordialmente,

*Jorge Alonso Toro*
Ing. Teleinformático.

http://jolthgs.wordpress.com/
www.devmicrosystem.com
--------------------------------------------------------------
Powered By Debian.
Developer Bullix GNU/Linux.
--------------------------------------------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBIWWH6q7mzdgTzI5ARAkX5AJ9TR6hL2ocLMOUDRfhts8DlVl+jpwCeNw5x
p4+4FNUHPDUx1lU9F8WSKCA=
=zRhQ
-----END PGP SIGNATURE-----
Este correo esta protegido bajo los términos de la Licencia
Atribución-Compartir Obras Derivadas Igual a 2.5 Colombia de Creative
Commons. Observé la licencia visitando este sitio
http://creativecommons.org/licenses/by-sa/2.5/co/.

El 10 de julio de 2012 09:23, Javier Aquino <JAquino(at)lexuseditores(dot)com>escribió:

> **
> Tienes razón Alvaro ... confundí lo rápido (velocidad) con lo fácil
> (sentencia).
>
> Thanks por la observación ;-)
>
> Slds,
>
> Javier.
>
>
>
> On Mon, 2012-07-09 at 23:06 -0400, Alvaro Herrera wrote:
>
> Excerpts from Javier Aquino's message of lun jul 09 21:48:50 -0400 2012:
> > OK,
> >
> > No había caído en cuenta de ello.
> >
> > Entonces te quedaría 2 opciones:
> >
> > 1. Crear un campo position_id en tu tabla "maestra" gps, este campo se
> > actualizaría cada vez que realices un insert nuevo a tu tabla positions.
> >
> > Pros:
> > - Actualización muy rápida ya que solo actualizas un campo int.
>
> Esto no es tal. Al hacer un UPDATE en Postgres, tiene que crearse una
> versión completa nueva del registro, que es idéntica al anterior y sólo
> difiere en el campo int que cambiaste. Así que no es para nada tan
> rápido como sugieres.
>
> > 2. crear una tabla nueva exactamente igual a positions llamado
> > last_positions, pero con dos cambios ( id integer y no serial, gps_id
> > primary key) y este se actualizaría cada vez que ingrese un dato nuevo a
> > tu tabla positions.
>
> Esta idea es mucho mejor.
>
> > BEGIN
> > update last_positions
> > set (id, gps_id, position, velocidad, altura, fecha, grados,
> > satelites) = ( new.id, gps_id, new.position, new.velocidad,
> > new.altura, new.fecha, new.grados, new.satelites)
> > where gps_id = new.gps_id;
> > if not found then
> > insert into last_positions
> > values ( new.* );
> > end if;
>
> Buena suerte consiguiendo que esto funcione bien cuando haya dos
> procesos insertando registros nuevos para un mismo gps_id.
> Creo que es más sano tomar un SELECT FOR UPDATE.
>
>
>
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Lazáro Rubén García Martínez 2012-07-11 21:21:02 RE: Comparacion entre dos Bases de Datos.
Previous Message Juan 2012-07-11 17:44:13 Re: funcion select pg_table_size da 0 (cero)