Hola Alejandro, gracias por tu ayuda. Lo que entiendo de tu propuesta es hacer:
gps ----------- id serial PK name text type text active boolean position_id integer -- índice a la última posición del gps. positions -------------- id serial PK gps_id integer FK (gps.id) posicion point velocidad real altura real date timestamp grados real satelites integer CREATE INDEX "gps_position_id" ON "gps" ("position_id"); CREATE INDEX "positions_gps_id" ON "positions" ("gps_id"); Gracias de antemano. *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 9 de julio de 2012 10:34, Alejandro Carrillo <faster...@yahoo.es>escribió: > 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 > > >