Creo que lo mejor es hacer un índice único en la tabla GPS (llave primaria), un campo donde esté la última posición del GPS y otro índice en la llave foránea de GPS en la tabla positions. Y crear una function asi:
CREATE OR REPLACE FUNCTION public.fn_guardar_posicion ( gps_id_ integer, posicion_ varchar, velocidad_ real, altura_ real, fecha_ timestamp, grados_ real, satelites_ integer ) RETURNS integer AS $body$ DECLARE retorno INTEGER; BEGIN INSERT INTO positions ( gps_id, posicion, velocidad, altura, fecha, grados, satelites ) VALUES ( gps_id_, posicion_, velocidad_, altura_, fecha_, grados_, satelites_ )RETURNING id INTO retorno; if (id is null) then UPDATE gps SET posicion = posicion_, WHERE id = gps_id_; end if; ; RETURN retorno; END; $body$ LANGUAGE 'plpgsql'; Así no necesitas tener más tablas adicionales. No olvidar hacer vacuum full a las tablas periódicamente en horario donde haya pocas transacciones. >________________________________ > De: Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu> >Para: Jorge Toro <jolt...@gmail.com>; Foro Postgres ><pgsql-es-ayuda@postgresql.org> >Enviado: Lunes 9 de julio de 2012 10:21 >Asunto: RE: [pgsql-es-ayuda] Ayuda con inquietud > >Entonces podrias tener dos tablas positions, una que se llame hist_positions >por ejemplo, y la otra positions, sobre positions almacenas la última >ubicación de los gps y sobre hist_positions el historial de posiciones de los >gps, para almacenar las posiciones de los gps utililizas una función, y para >llevar el historial de los gps, puedes utilizar un trigger sobre positions. >Acá te dejo el código de todo, solo falta la referencia de la clave foránea. >Espero que te sirva. > >PD: Pudieran existir otras soluciones. > >--Crear la tabla positions >CREATE TABLE public.positions ( > id SERIAL, > gps_id INTEGER, > posicion VARCHAR, > velocidad REAL, > altura REAL, > fecha TIMESTAMP WITHOUT TIME ZONE, > grados REAL, > satelites INTEGER, > CONSTRAINT positions_pkey PRIMARY KEY(id) >) WITHOUT OIDS; > >--Crear la tabla hist_positions >CREATE TABLE public.hist_positions ( > id SERIAL, > gps_id INTEGER, > posicion VARCHAR, > velocidad REAL, > altura REAL, > fecha TIMESTAMP WITHOUT TIME ZONE, > grados REAL, > satelites INTEGER, > CONSTRAINT hist_positions_pkey PRIMARY KEY(id) >) WITHOUT OIDS; > >--Función para guardar en positions >CREATE OR REPLACE FUNCTION public.fun_guardar_posicion ( > gps_id_ integer, > posicion_ varchar, > velocidad_ real, > altura_ real, > fecha_ timestamp, > grados_ real, > satelites_ integer >) >RETURNS integer AS >$body$ >DECLARE > retorno INTEGER; >BEGIN > UPDATE positions > SET > posicion = posicion_, > velocidad = velocidad_, > altura = altura_, > fecha = fecha_, > grados = grados_, > satelites = satelites_ > WHERE gps_id = gps_id_ > RETURNING id INTO retorno; > > IF (retorno IS NULL) THEN > INSERT INTO positions > ( > gps_id, > posicion, > velocidad, > altura, > fecha, > grados, > satelites > ) > VALUES ( > gps_id_, > posicion_, > velocidad_, > altura_, > fecha_, > grados_, > satelites_ > )RETURNING id INTO retorno; > END IF; > > RETURN retorno; >END; >$body$ >LANGUAGE 'plpgsql'; > >--Función ejecutada por el trigger para guardar en el historial de positions >CREATE OR REPLACE FUNCTION public.fun_trg_hist_positions ( >) >RETURNS trigger AS >$body$ >DECLARE >BEGIN > INSERT INTO hist_positions > ( > gps_id, > posicion, > velocidad, > altura, > fecha, > grados, > satelites > ) > VALUES ( > NEW.gps_id, > NEW.posicion, > NEW.velocidad, > NEW.altura, > NEW.fecha, > NEW.grados, > NEW.satelites > ); > > RETURN NULL; >END; >$body$ >LANGUAGE 'plpgsql'; > >--Trigger utilizado >CREATE TRIGGER trg_hist_positions AFTER INSERT OR UPDATE >ON public.positions FOR EACH ROW >EXECUTE PROCEDURE public.fun_trg_hist_positions(); > >Saludos a todos. >________________________________________ >From: pgsql-es-ayuda-ow...@postgresql.org >[pgsql-es-ayuda-ow...@postgresql.org] On Behalf Of Jorge Toro >[jolt...@gmail.com] >Sent: Monday, July 09, 2012 9:43 AM >To: Foro Postgres >Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud > >Hola Lazáro, gracias por responder. > >Sí gps.id<http://gps.id> es la referencia a una tabla "gps" que se usa para >registrar cada uno de los GPS que se registran para ser aceptados por el >servidor. >Esta tabla "gps" tiene datos como: id, name, type, active. de cada uno de los >GPS. Y la tabla "position" se encarga de almacenar los reportes (históricos) >hechos por cada GPS. > >Y lo que quiero lograr es, tener a la mano siempre que consulte un >dispositivo, toda la última información de dicho dispositivo que se encuentre >en la tabla "position". > >Pero no quiero realizar una consulta directa a la tabla "position" porque son >alrededor de 1000 GPS reportando cada minuto y esta tabla "position" tenderá a >ser demasiado grande con el pasar del tiempo. > > >Por tu ayuda muchas gracias, > > >Jorge Alonso Toro >Ing. Teleinformático. > >http://jolthgs.wordpress.com/ >www.devmicrosystem.com<http://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 9 de julio de 2012 09:17, Lazáro Rubén García Martínez ><lgarc...@vnz.uci.cu<mailto:lgarc...@vnz.uci.cu>> escribió: >La columna gps_id es única > > >________________________________ >Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE >ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! >http://www.antiterroristas.cu >http://justiciaparaloscinco.wordpress.com > >Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE >ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! >http://www.antiterroristas.cu >http://justiciaparaloscinco.wordpress.com >- >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 > > >