Gracias a todos por su ayuda y colaboración. Muy agradecido,
*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 14:06, Alejandro Carrillo <faster...@yahoo.es>escribió: > mmm puede ser, pero le apuesto más a guardar la ultima fecha_hora y > posicion del evento asi no tienes q ir a buscar en la otra tabla (lo de la > foranea es por temas de actualización de llave primaria o borrado físico > sobre GPS). Cabe corregir a la function (sea q la metas en un trigger o > no), que deba consultar si la fecha a ingresar es mayor a la ultima fecha > (la ultima fecha se encuentra en la tabla de GPS y para cuando no tenga > registros para ese GPS seria la fecha que se va a insertar en la tabla > posiciones), tal como lo dice Mario: > - Te comento de mi experiencia, que si trabajas con reportes de GPS, > chequees la fecha sea igual o mayor a la anterior que tienes en la tabla > de ultimos reportes. Algunos equipos pueden disparar reportes retrasados > (no se si es tu caso) y hacer updates de fecha y hora de reportes > anteriores a la última. > Sobre todo IGUAL o mayor, ya que cualquier otro cambio que quieras hacer > sin tocar la fecha (Cambio de estado o lo que fuere) no te dejará. > > Por ultimo, debes tener en cuenta que a la hora de hacer reportes por > fecha_hora por GPS o fecha_hora de los GPS será necesario 1 indice más en > la fecha_hora de positions y GPS. No es necesario escribir el indice en las > PK ya que estas lo crean automáticamente. ultfechahora tampoco requiere > indice ya que consultarás por la PK y no por la ultima fecha del evento del > GPS (solo se consulta por ultfechahora para efectos de comparación, ya que > la busqueda la debe hacer por la PK) Entonces tu DDL quedaría: > > gps > ----------- > id serial PK > name text > type text > active boolean > posicion varchar > ultfechahora timestamp --última fechahora 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"); este indice se > va porq lo debe crear la PK > > CREATE INDEX "positions_gps_id" ON "positions" ("gps_id"); > CREATE INDEX "positions_date" ON "positions" ("date"); > > > 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; > --si se insertó con éxito, actualice la ultima fecha del GPS > if (retorno is not null) then > > UPDATE gps > SET > posicion = posicion_, > ultfechahora = fecha_ > WHERE id = gps_id_ and ultfechahora is not null and ultfechahora > < fecha_ ; --esto tambien funciona no actualizando cuando la fecha es menor > a la ultima > end if; > ; > > RETURN retorno; > END; > $body$ > LANGUAGE 'plpgsql'; > > > > ------------------------------ > *De:* Jorge Toro <jolt...@gmail.com> > *Para:* Alejandro Carrillo <faster...@yahoo.es> > *CC:* Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu>; Foro Postgres < > pgsql-es-ayuda@postgresql.org> > *Enviado:* Lunes 9 de julio de 2012 11:13 > *Asunto:* Re: [pgsql-es-ayuda] Ayuda con inquietud > > 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 > > > > > >