Si quieres puedes meter esa función en un trigger de la tabla positions; así cuando se agrege una posicion del GPS, se actualice en la tabla gps. No olvidaer hacer vacuum full periódicamente a la tabla GPS, ya que las actualizaciones realmente son borrados e inserciones de los datos.
>________________________________ > De: Alejandro Carrillo <faster...@yahoo.es> >Para: Alejandro Carrillo <faster...@yahoo.es>; Lazáro Rubén García Martínez ><lgarc...@vnz.uci.cu>; Jorge Toro <jolt...@gmail.com>; Foro Postgres ><pgsql-es-ayuda@postgresql.org> >Enviado: Lunes 9 de julio de 2012 10:55 >Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud > > >perdon, por favor corregir el is null por is not null > > > > >>________________________________ >> De: Alejandro Carrillo <faster...@yahoo.es> >>Para: Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu>; Jorge Toro >><jolt...@gmail.com>; Foro Postgres <pgsql-es-ayuda@postgresql.org> >>Enviado: Lunes 9 de julio de 2012 10:34 >>Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud >> >> >>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 >>> >>> >>> >> >> > >