Lists: | pgsql-es-ayuda |
---|
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Ayuda con inquietud |
Date: | 2012-07-09 12:56:35 |
Message-ID: | CAK0+Q8_e+K4FV8u4gkma-TAdWmu+nLk06bCn7sKvOGC=SuiSDg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Hola lista hoy acudo a ustedes con la siguiente inquietud.
Tengo un programa servidor que captura los datos enviados por unos
dispositivos "gps" y los almacena en una una tabla "positions". La tabla
positions tiene la siguiente estructura:
positions
--------------
id serial PK
gps_id integer FK ( de gps.id)
posicion point
velocidad real
altura real
date timestamp
grados real
satelites integer
Ya que los dispositivos GPS envían información de su ubicación cada minuto,
me es de gran importancia almacenar de alguna forma el último dato de cada
GPS que se encuentra en la tabla "position", para poder mostrar la última
información enviada por cada uno de los GPS en el momento que se ingrese a
una página web.
Mi duda sinceramente es que no se cómo realizar esta tarea de una forma
eficiente.
He pensado en hacer una vista llamada "position_gps_actual" que me almacene
el último dato de cada GPS dentro de la tabla "position" en el momento que
se le ingrese un nuevo dato a esta tabla. Pero no se cómo puedo hacerlo, ya
que mis comocimientos en PostgreSQL son básicos y creo que requiero de
PL/SQL (En este momento le he dado solución realizando programación en el
servidor para que cuando un GPS envíe información además de alamacenarla en
la tabla "position" también me la almacene en una tabla que contenga cada
uno de los GPS y con un UPDATE me ponga esa data en el respectivo GPS.).
Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo tomar
y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya tengo poco
tiempo para entregar este proyecto y este es un tema que quiero solucionar
de la mejor manera.
A todos muchas gracias y atento a sus comentarios.
*
*
*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/.
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 14:13:17 |
Message-ID: | CAK0+Q8-egL6A0OetJQHi5sXrWBS1jNfScGjnsnKWF8es5A_AtQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Hola Lazáro, gracias por responder.
Sí 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
--------------------------------------------------------------
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 <
lgarciam(at)vnz(dot)uci(dot)cu> escribió:
> La columna gps_id es única
From: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Ayuda con inquietud |
Date: | 2012-07-09 14:17:10 |
Message-ID: | 294D3D02D5E18D42827B2ECFEADEB688472A44BB78@mx-interno.vnz.uci.cu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
La columna gps_id es única, o almacenas en la tabla toda la trasa de las ubicaciones de los gps??
Saludos.
________________________________________
From: pgsql-es-ayuda-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)com]
Sent: Monday, July 09, 2012 8:26 AM
To: Foro Postgres
Subject: [pgsql-es-ayuda] Ayuda con inquietud
Hola lista hoy acudo a ustedes con la siguiente inquietud.
Tengo un programa servidor que captura los datos enviados por unos dispositivos "gps" y los almacena en una una tabla "positions". La tabla positions tiene la siguiente estructura:
positions
--------------
id serial PK
gps_id integer FK ( de gps.id<http://gps.id>)
posicion point
velocidad real
altura real
date timestamp
grados real
satelites integer
Ya que los dispositivos GPS envían información de su ubicación cada minuto, me es de gran importancia almacenar de alguna forma el último dato de cada GPS que se encuentra en la tabla "position", para poder mostrar la última información enviada por cada uno de los GPS en el momento que se ingrese a una página web.
Mi duda sinceramente es que no se cómo realizar esta tarea de una forma eficiente.
He pensado en hacer una vista llamada "position_gps_actual" que me almacene el último dato de cada GPS dentro de la tabla "position" en el momento que se le ingrese un nuevo dato a esta tabla. Pero no se cómo puedo hacerlo, ya que mis comocimientos en PostgreSQL son básicos y creo que requiero de PL/SQL (En este momento le he dado solución realizando programación en el servidor para que cuando un GPS envíe información además de alamacenarla en la tabla "position" también me la almacene en una tabla que contenga cada uno de los GPS y con un UPDATE me ponga esa data en el respectivo GPS.).
Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo tomar y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya tengo poco tiempo para entregar este proyecto y este es un tema que quiero solucionar de la mejor manera.
A todos muchas gracias y atento a sus comentarios.
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/.
________________________________
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
From: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Ayuda con inquietud |
Date: | 2012-07-09 15:21:59 |
Message-ID: | 294D3D02D5E18D42827B2ECFEADEB688472A44BB7C@mx-interno.vnz.uci.cu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu> |
Cc: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 15:29:06 |
Message-ID: | CAK0+Q88i5-9oePADHhLf8+QvWCSxE0d6kWNjXF_GRqh=UByeUw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Hola Lazáro, En realidad te agradezco muchísimo tu ayuda.
Yo estaba pensando en hacer algo como eso, en este momento estoy estudiando
tu código.
Mi idea era crear una función que cuando fuera llamada realizara un INSERT
en la tabla "h_positions" y un UPDATE en una tabla como "positions".
El problema son mis cortos conocimientos en temas como funciones, PL/pgSQL
y triggres, me sería de gran ayuda no solo quedarme con tu solución, si no
que si tienes documentación para novatos como yo, me puedas ayudar para
aprender un poco sobre este tema.
De antemano muchas gracias.
*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:21, Lazáro Rubén García Martínez <
lgarciam(at)vnz(dot)uci(dot)cu> escribió:
> 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-owner(at)postgresql(dot)org [
> pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [
> jolthgs(at)gmail(dot)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 <
> lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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
>
From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>, Jorge Toro <jolthgs(at)gmail(dot)com>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 15:34:51 |
Message-ID: | 1341848091.46866.YahooMailNeo@web171006.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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 <lgarciam(at)vnz(dot)uci(dot)cu>
>Para: Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org)
>Para cambiar tu suscripción:
>http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>
>
From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es>, Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>, Jorge Toro <jolthgs(at)gmail(dot)com>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 15:55:24 |
Message-ID: | 1341849324.73558.YahooMailNeo@web171003.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
perdon, por favor corregir el is null por is not null
>________________________________
> De: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
>Para: Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>; Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu>
>>Para: Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org)
>>Para cambiar tu suscripción:
>>http://www.postgresql.org/mailpref/pgsql-es-ayuda
>>
>>
>>
>
>
From: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com> |
Cc: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Ayuda con inquietud |
Date: | 2012-07-09 15:56:04 |
Message-ID: | 294D3D02D5E18D42827B2ECFEADEB688472A44BB7E@mx-interno.vnz.uci.cu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Puedes hecharle un ojo a estos vínculos:
http://www.postgresql.org.es/node/301
http://www.postgresql.org.es/node/297
Saludos.
________________________________________
From: Jorge Toro [jolthgs(at)gmail(dot)com]
Sent: Monday, July 09, 2012 10:59 AM
To: Lazáro Rubén García Martínez
Cc: Foro Postgres
Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud
Hola Lazáro, En realidad te agradezco muchísimo tu ayuda.
Yo estaba pensando en hacer algo como eso, en este momento estoy estudiando tu código.
Mi idea era crear una función que cuando fuera llamada realizara un INSERT en la tabla "h_positions" y un UPDATE en una tabla como "positions".
El problema son mis cortos conocimientos en temas como funciones, PL/pgSQL y triggres, me sería de gran ayuda no solo quedarme con tu solución, si no que si tienes documentación para novatos como yo, me puedas ayudar para aprender un poco sobre este tema.
De antemano 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 10:21, Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)cu>> escribió:
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-owner(at)postgresql(dot)org<mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org> [pgsql-es-ayuda-owner(at)postgresql(dot)org<mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org>] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)com<mailto:jolthgs(at)gmail(dot)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><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><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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)cu><mailto:lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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
________________________________
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
From: | Mario Sileone <msileone(at)gmail(dot)com> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 16:04:41 |
Message-ID: | 4FFB0119.4050805@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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á.
Saludos
El 09/07/2012 12:56, Lazáro Rubén García Martínez escribió:
> Puedes hecharle un ojo a estos vínculos:
>
> http://www.postgresql.org.es/node/301
>
> http://www.postgresql.org.es/node/297
>
> Saludos.
> ________________________________________
> From: Jorge Toro [jolthgs(at)gmail(dot)com]
> Sent: Monday, July 09, 2012 10:59 AM
> To: Lazáro Rubén García Martínez
> Cc: Foro Postgres
> Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud
>
> Hola Lazáro, En realidad te agradezco muchísimo tu ayuda.
>
> Yo estaba pensando en hacer algo como eso, en este momento estoy estudiando tu código.
> Mi idea era crear una función que cuando fuera llamada realizara un INSERT en la tabla "h_positions" y un UPDATE en una tabla como "positions".
>
> El problema son mis cortos conocimientos en temas como funciones, PL/pgSQL y triggres, me sería de gran ayuda no solo quedarme con tu solución, si no que si tienes documentación para novatos como yo, me puedas ayudar para aprender un poco sobre este tema.
>
> De antemano 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 10:21, Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)cu>> escribió:
> 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-owner(at)postgresql(dot)org<mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org> [pgsql-es-ayuda-owner(at)postgresql(dot)org<mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org>] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)com<mailto:jolthgs(at)gmail(dot)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><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><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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)cu><mailto:lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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
>
>
> ________________________________
> 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(at)postgresql(dot)org)
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
--
Mario Sileone
From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>, Jorge Toro <jolthgs(at)gmail(dot)com>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 16:12:11 |
Message-ID: | 1341850331.26288.YahooMailNeo@web171002.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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 <fasterzip(at)yahoo(dot)es>
>Para: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>; Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>; Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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 <fasterzip(at)yahoo(dot)es>
>>Para: Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>; Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu>
>>>Para: Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org)
>>>Para cambiar tu suscripción:
>>>http://www.postgresql.org/mailpref/pgsql-es-ayuda
>>>
>>>
>>>
>>
>>
>
>
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
Cc: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 16:13:12 |
Message-ID: | CAK0+Q89NomxBS2_ex7qCtAHG6j6UXqFRhPkgJV7BmWU1hR-E+w@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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 <fasterzip(at)yahoo(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu>
> *Para:* Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <
> pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [
> pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [
> jolthgs(at)gmail(dot)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 <
> lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>
>
From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com> |
Cc: | Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>, Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 19:06:13 |
Message-ID: | 1341860773.30639.YahooMailNeo@web171006.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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 <jolthgs(at)gmail(dot)com>
>Para: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
>CC: Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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 <fasterzip(at)yahoo(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu>
>>>Para: Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [jolthgs(at)gmail(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org)
>>>Para cambiar tu suscripción:
>>>http://www.postgresql.org/mailpref/pgsql-es-ayuda
>>>
>>>
>>>
>
>
>
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 22:39:17 |
Message-ID: | CAK0+Q88xZH_bWO1S6A5HdF0Utdyq+StWux6-MWvZXA4i-s=8QA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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 <fasterzip(at)yahoo(dot)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 <jolthgs(at)gmail(dot)com>
> *Para:* Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
> *CC:* Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>; Foro Postgres <
> pgsql-es-ayuda(at)postgresql(dot)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 <fasterzip(at)yahoo(dot)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 <lgarciam(at)vnz(dot)uci(dot)cu>
> *Para:* Jorge Toro <jolthgs(at)gmail(dot)com>; Foro Postgres <
> pgsql-es-ayuda(at)postgresql(dot)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-owner(at)postgresql(dot)org [
> pgsql-es-ayuda-owner(at)postgresql(dot)org] On Behalf Of Jorge Toro [
> jolthgs(at)gmail(dot)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 <
> lgarciam(at)vnz(dot)uci(dot)cu<mailto:lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>
>
>
>
>
From: | Javier Aquino <JAquino(at)LexusEditores(dot)com> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com> |
Cc: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-09 23:57:20 |
Message-ID: | 1341878240.8628.59.camel@javier-ntb |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Estimado Jorge,
Y no te ayudaría un sentencia select comun y corriente com esta ???
SELECT *
FROM positions p1
JOIN ( select gps_id, max(date) date from positions group by
gps_id) p2
USING ( gps_id, date )
;
Esta consulta te devolvería el ultimo registro de cada gps_id.
Espero te sirva.
Saludos y éxitos.
Javier.
On Mon, 2012-07-09 at 07:56 -0500, Jorge Toro wrote:
> Hola lista hoy acudo a ustedes con la siguiente inquietud.
>
>
> Tengo un programa servidor que captura los datos enviados por unos
> dispositivos "gps" y los almacena en una una tabla "positions". La
> tabla positions tiene la siguiente estructura:
>
>
> positions
> --------------
> id serial PK
> gps_id integer FK ( de gps.id)
> posicion point
> velocidad real
> altura real
> date timestamp
> grados real
> satelites integer
>
>
>
>
> Ya que los dispositivos GPS envían información de su ubicación cada
> minuto, me es de gran importancia almacenar de alguna forma el último
> dato de cada GPS que se encuentra en la tabla "position", para poder
> mostrar la última información enviada por cada uno de los GPS en el
> momento que se ingrese a una página web.
>
>
> Mi duda sinceramente es que no se cómo realizar esta tarea de una
> forma eficiente.
>
>
> He pensado en hacer una vista llamada "position_gps_actual" que me
> almacene el último dato de cada GPS dentro de la tabla "position" en
> el momento que se le ingrese un nuevo dato a esta tabla. Pero no se
> cómo puedo hacerlo, ya que mis comocimientos en PostgreSQL son básicos
> y creo que requiero de PL/SQL (En este momento le he dado solución
> realizando programación en el servidor para que cuando un GPS envíe
> información además de alamacenarla en la tabla "position" también me
> la almacene en una tabla que contenga cada uno de los GPS y con un
> UPDATE me ponga esa data en el respectivo GPS.).
>
>
> Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo
> tomar y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya
> tengo poco tiempo para entregar este proyecto y este es un tema que
> quiero solucionar de la mejor manera.
>
>
>
>
> A todos muchas gracias y atento a sus comentarios.
>
>
>
>
> 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/.
>
From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Javier Aquino <JAquino(at)LexusEditores(dot)com>, Jorge Toro <jolthgs(at)gmail(dot)com> |
Cc: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-10 00:06:10 |
Message-ID: | 1341878770.54905.YahooMailNeo@web171006.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Creo que el tema aquí es por la velocidad de acceso a los registros, ya que en esa tabla pueden haber 100 o 200 millones de registros por ser un sistema de GPS con 1000 GPS's.
>________________________________
> De: Javier Aquino <JAquino(at)LexusEditores(dot)com>
>Para: Jorge Toro <jolthgs(at)gmail(dot)com>
>CC: Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
>Enviado: Lunes 9 de julio de 2012 18:57
>Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud
>
>
>Estimado Jorge,
>
>Y no te ayudaría un sentencia select comun y corriente com esta ???
>
> SELECT *
> FROM positions p1
> JOIN ( select gps_id, max(date) date from positions group by gps_id) p2
> USING ( gps_id, date )
>;
>
>
>Esta consulta te devolvería el ultimo registro de cada gps_id.
>
>Espero te sirva.
>
>Saludos y éxitos.
>
>Javier.
>
>
>On Mon, 2012-07-09 at 07:56 -0500, Jorge Toro wrote:
>Hola lista hoy acudo a ustedes con la siguiente inquietud.
>
>>
>>
>Tengo un programa servidor que captura los datos enviados por unos dispositivos "gps" y los almacena en una una tabla "positions". La tabla positions tiene la siguiente estructura:
>
>>
>>
> positions
>--------------
>id serial PK
>gps_id integer FK ( de gps.id)
>posicion point
>velocidad real
>altura real
>date timestamp
>grados real
>satelites integer
>
>>
>>
>
>>
>>
>Ya que los dispositivos GPS envían información de su ubicación cada minuto, me es de gran importancia almacenar de alguna forma el último dato de cada GPS que se encuentra en la tabla "position", para poder mostrar la última información enviada por cada uno de los GPS en el momento que se ingrese a una página web.
>
>>
>>
>Mi duda sinceramente es que no se cómo realizar esta tarea de una forma eficiente.
>
>>
>>
>He pensado en hacer una vista llamada "position_gps_actual" que me almacene el último dato de cada GPS dentro de la tabla "position" en el momento que se le ingrese un nuevo dato a esta tabla. Pero no se cómo puedo hacerlo, ya que mis comocimientos en PostgreSQL son básicos y creo que requiero de PL/SQL (En este momento le he dado solución realizando programación en el servidor para que cuando un GPS envíe información además de alamacenarla en la tabla "position" también me la almacene en una tabla que contenga cada uno de los GPS y con un UPDATE me ponga esa data en el respectivo GPS.).
>
>>
>>
>Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo tomar y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya tengo poco tiempo para entregar este proyecto y este es un tema que quiero solucionar de la mejor manera.
>
>>
>>
>
>>
>>
>A todos muchas gracias y atento a sus comentarios.
>
>>
>>
>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/.
>>
>>
>
>
>
From: | Jorge Toro <jolthgs(at)gmail(dot)com> |
---|---|
To: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-10 00:14:44 |
Message-ID: | CAK0+Q88MzxD8244QtNXW4ziupv0Dmuu24KMY_iNUdMdAVF7OCw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Hola Javier, gracias por tu aporte. Pero como menciona Alejandro el
problema radica en que esta tabla contendrá muchos registros rápidamente y
en un futuro no muy lejano tendrá millones de registros.
Gracias a todos nuevamente,
*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 19:06, Alejandro Carrillo <fasterzip(at)yahoo(dot)es>escribió:
> Creo que el tema aquí es por la velocidad de acceso a los registros, ya
> que en esa tabla pueden haber 100 o 200 millones de registros por ser un
> sistema de GPS con 1000 GPS's.
>
> ------------------------------
> *De:* Javier Aquino <JAquino(at)LexusEditores(dot)com>
> *Para:* Jorge Toro <jolthgs(at)gmail(dot)com>
> *CC:* Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
> *Enviado:* Lunes 9 de julio de 2012 18:57
>
> *Asunto:* Re: [pgsql-es-ayuda] Ayuda con inquietud
>
> Estimado Jorge,
>
> Y no te ayudaría un sentencia select comun y corriente com esta ???
>
> SELECT *
> FROM positions p1
> JOIN ( select gps_id, max(date) date from positions group by gps_id)
> p2
> USING ( gps_id, date )
> ;
>
>
> Esta consulta te devolvería el ultimo registro de cada gps_id.
>
> Espero te sirva.
>
> Saludos y éxitos.
>
> Javier.
>
>
> On Mon, 2012-07-09 at 07:56 -0500, Jorge Toro wrote:
>
> Hola lista hoy acudo a ustedes con la siguiente inquietud.
>
>
>
> Tengo un programa servidor que captura los datos enviados por unos
> dispositivos "gps" y los almacena en una una tabla "positions". La tabla
> positions tiene la siguiente estructura:
>
>
>
> positions
>
> --------------
>
> id serial PK
>
> gps_id integer FK ( de gps.id)
>
> posicion point
>
> velocidad real
>
> altura real
>
> date timestamp
>
> grados real
>
> satelites integer
>
>
>
>
>
> Ya que los dispositivos GPS envían información de su ubicación cada
> minuto, me es de gran importancia almacenar de alguna forma el último dato
> de cada GPS que se encuentra en la tabla "position", para poder mostrar la
> última información enviada por cada uno de los GPS en el momento que se
> ingrese a una página web.
>
>
>
> Mi duda sinceramente es que no se cómo realizar esta tarea de una forma
> eficiente.
>
>
>
> He pensado en hacer una vista llamada "position_gps_actual" que me
> almacene el último dato de cada GPS dentro de la tabla "position" en el
> momento que se le ingrese un nuevo dato a esta tabla. Pero no se cómo puedo
> hacerlo, ya que mis comocimientos en PostgreSQL son básicos y creo que
> requiero de PL/SQL (En este momento le he dado solución realizando
> programación en el servidor para que cuando un GPS envíe información además
> de alamacenarla en la tabla "position" también me la almacene en una tabla
> que contenga cada uno de los GPS y con un UPDATE me ponga esa data en el
> respectivo GPS.).
>
>
>
> Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo
> tomar y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya tengo
> poco tiempo para entregar este proyecto y este es un tema que quiero
> solucionar de la mejor manera.
>
>
>
>
>
> A todos muchas gracias y atento a sus comentarios.
>
>
>
> *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/.
>
>
>
>
>
From: | Javier Aquino <JAquino(at)LexusEditores(dot)com> |
---|---|
To: | Jorge Toro <jolthgs(at)gmail(dot)com> |
Cc: | Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-10 01:48:50 |
Message-ID: | 1341884930.8628.79.camel@javier-ntb |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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.
Contras:
- La tabla maestra no debería tener un volumen alto de actualizaciones
- Solo tienes el id de positions, lo cual te obliga a consultar esta
tabla para ver los datos ( posicion, velocidad, altura, etc.)
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.
Pros:
- Tu tabla maestra no sufre actualizaciones masivas
- Tienes los datos completos de positions.
Contras:
- La actualización es un poco mas lenta (milisegundos) que la opción
anterior ya que graba todo el registro y no solo un campo.
Para el caso uno (1) ya te dieron un script, para el caso dos (2) puedes
hacer esto:
CREATE TABLE last_positions
(
id integer NOT NULL,
gps_id integer NOT NULL,
"position" point,
velocidad real,
altura real,
fecha timestamp(0) with time zone,
grados real,
satelites integer,
CONSTRAINT last_positions_pkey PRIMARY KEY (gps_id )
);
CREATE OR REPLACE FUNCTION positions_bi_fn()
RETURNS trigger AS
$BODY$
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;
return new;
END;
$BODY$
;
CREATE TRIGGER positions_bi
BEFORE INSERT
ON positionsier.
FOR EACH ROW
EXECUTE PROCEDURE positions_bi_fn();
Saludos y nuevamente éxitos en tu proyecto, luego nos cuentas como te
fue.
Javier.
On Mon, 2012-07-09 at 19:14 -0500, Jorge Toro wrote:
> Hola Javier, gracias por tu aporte. Pero como menciona Alejandro el
> problema radica en que esta tabla contendrá muchos
> registros rápidamente y en un futuro no muy lejano tendrá millones de
> registros.
>
>
>
> Gracias a todos nuevamente,
>
> 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 19:06, Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
> escribió:
>
> Creo que el tema aquí es por la velocidad de acceso a los
> registros, ya que en esa tabla pueden haber 100 o 200 millones
> de registros por ser un sistema de GPS con 1000 GPS's.
>
>
>
>
> ______________________________________________________
> De: Javier Aquino <JAquino(at)LexusEditores(dot)com>
> Para: Jorge Toro <jolthgs(at)gmail(dot)com>
> CC: Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
> Enviado: Lunes 9 de julio de 2012 18:57
>
>
> Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud
>
>
>
>
> Estimado Jorge,
>
> Y no te ayudaría un sentencia select comun y corriente
> com esta ???
>
> SELECT *
> FROM positions p1
> JOIN ( select gps_id, max(date) date from
> positions group by gps_id) p2
> USING ( gps_id, date )
> ;
>
>
> Esta consulta te devolvería el ultimo registro de cada
> gps_id.
>
> Espero te sirva.
>
> Saludos y éxitos.
>
> Javier.
>
>
> On Mon, 2012-07-09 at 07:56 -0500, Jorge Toro wrote:
>
> > Hola lista hoy acudo a ustedes con la siguiente
> > inquietud.
> >
> >
> > Tengo un programa servidor que captura los datos
> > enviados por unos dispositivos "gps" y los almacena
> > en una una tabla "positions". La tabla positions
> > tiene la siguiente estructura:
> >
> >
> > positions
> > --------------
> > id serial PK
> > gps_id integer FK ( de gps.id)
> > posicion point
> > velocidad real
> > altura real
> > date timestamp
> > grados real
> > satelites integer
> >
> >
> >
> >
> > Ya que los dispositivos GPS envían información de su
> > ubicación cada minuto, me es de gran importancia
> > almacenar de alguna forma el último dato de cada GPS
> > que se encuentra en la tabla "position", para poder
> > mostrar la última información enviada por cada uno
> > de los GPS en el momento que se ingrese a una página
> > web.
> >
> >
> > Mi duda sinceramente es que no se cómo realizar esta
> > tarea de una forma eficiente.
> >
> >
> > He pensado en hacer una vista llamada
> > "position_gps_actual" que me almacene el último dato
> > de cada GPS dentro de la tabla "position" en el
> > momento que se le ingrese un nuevo dato a esta
> > tabla. Pero no se cómo puedo hacerlo, ya que mis
> > comocimientos en PostgreSQL son básicos y creo que
> > requiero de PL/SQL (En este momento le he dado
> > solución realizando programación en el servidor para
> > que cuando un GPS envíe información además de
> > alamacenarla en la tabla "position" también me la
> > almacene en una tabla que contenga cada uno de los
> > GPS y con un UPDATE me ponga esa data en el
> > respectivo GPS.).
> >
> >
> > Me ayudaría mucho si me pueden ayudar aclarándome el
> > camino que debo tomar y que debo aprender (en
> > PostgreSQL) para lograr mi objetivo. Ya tengo poco
> > tiempo para entregar este proyecto y este es un tema
> > que quiero solucionar de la mejor manera.
> >
> >
> >
> >
> > A todos muchas gracias y atento a sus comentarios.
> >
> >
> > 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/.
> >
>
>
>
>
>
>
>
>
>
>
From: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
---|---|
To: | Javier Aquino <jaquino(at)lexuseditores(dot)com> |
Cc: | Jorge Toro <jolthgs(at)gmail(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-10 03:06:01 |
Message-ID: | 1341889260-sup-3619@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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.
--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
From: | Javier Aquino <JAquino(at)LexusEditores(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | Jorge Toro <jolthgs(at)gmail(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Ayuda con inquietud |
Date: | 2012-07-10 14:23:54 |
Message-ID: | 1341930234.4065.1.camel@javier-ntb |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
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.
>
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 |
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.
>
>
>
>
From: | Edwin Quijada <listas_quijada(at)hotmail(dot)com> |
---|---|
To: | <fasterzip(at)yahoo(dot)es>, <jaquino(at)lexuseditores(dot)com>, <jolthgs(at)gmail(dot)com> |
Cc: | <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Ayuda con inquietud |
Date: | 2012-07-12 14:26:35 |
Message-ID: | BAY155-W29B2B110350FDBFC3FB927E3D00@phx.gbl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
En este caso optaria por hacer un particionamiento de la tabla de posiciones de los GPS, digamos mensual, con un script automatico, cada dia 1 creo una nueva particion.
Date: Tue, 10 Jul 2012 01:06:10 +0100
From: fasterzip(at)yahoo(dot)es
Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud
To: JAquino(at)LexusEditores(dot)com; jolthgs(at)gmail(dot)com
CC: pgsql-es-ayuda(at)postgresql(dot)org
Creo que el tema aquí es por la velocidad de acceso a los registros, ya que en esa tabla pueden haber 100 o 200 millones de registros por ser un sistema de GPS con 1000 GPS's.
De: Javier Aquino <JAquino(at)LexusEditores(dot)com>
Para: Jorge Toro <jolthgs(at)gmail(dot)com>
CC: Foro Postgres
<pgsql-es-ayuda(at)postgresql(dot)org>
Enviado: Lunes 9 de julio de 2012 18:57
Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud
Estimado Jorge,
Y no te ayudaría un sentencia select comun y corriente com esta ???
SELECT *
FROM positions p1
JOIN ( select gps_id, max(date) date from positions group by gps_id) p2
USING ( gps_id, date )
;
Esta consulta te devolvería el ultimo registro de cada gps_id.
Espero te sirva.
Saludos y éxitos.
Javier.
On Mon, 2012-07-09 at 07:56 -0500, Jorge Toro wrote:
Hola lista hoy acudo a ustedes con la siguiente inquietud.
Tengo un programa servidor que captura los datos enviados por unos dispositivos "gps" y los almacena en una una tabla "positions". La tabla positions tiene la siguiente estructura:
positions
--------------
id serial PK
gps_id integer FK ( de gps.id)
posicion point
velocidad real
altura real
date timestamp
grados real
satelites integer
Ya que los dispositivos GPS envían información de su ubicación cada minuto, me es de gran importancia almacenar de alguna forma el último dato de cada GPS que se encuentra en la tabla "position", para poder mostrar la última información enviada por cada uno de los GPS en el momento que se ingrese a una página web.
Mi duda sinceramente es que no se cómo realizar esta tarea de una forma eficiente.
He pensado en hacer una vista llamada "position_gps_actual" que me almacene el último dato de cada GPS dentro de la tabla "position" en el momento que se le ingrese un nuevo dato a esta tabla. Pero no se cómo puedo hacerlo, ya que mis comocimientos en PostgreSQL son básicos y creo que requiero de PL/SQL (En este momento le he dado solución realizando programación en el servidor para que cuando un GPS envíe información además de alamacenarla en la tabla "position" también me la almacene en una tabla que contenga cada uno de los GPS y con un UPDATE me ponga esa data en el respectivo GPS.).
Me ayudaría mucho si me pueden ayudar aclarándome el camino que debo tomar y que debo aprender (en PostgreSQL) para lograr mi objetivo. Ya tengo poco tiempo para entregar este proyecto y este es un tema que quiero solucionar de la mejor manera.
A todos muchas gracias y atento a sus comentarios.
Jorge Alonso Toro
Ing. Teleinformático.
--------------------------------------------------------------
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/.
From: | Edwin Quijada <listas_quijada(at)hotmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, <jaquino(at)lexuseditores(dot)com> |
Cc: | <jolthgs(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Ayuda con inquietud |
Date: | 2012-07-12 14:30:39 |
Message-ID: | BAY155-W2461ED70C2F058AFEAAB16E3D00@phx.gbl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-es-ayuda |
Tengo algo funcionando asi no con 1000GPS pero si con 120 y subiendo y lo que hice fue simplemente meter datos en esa tabla y hacer un particionamiento mensual. Mis GPS envian datos cada 30s y hasta ahora funciona muy bien.
> CC: jolthgs(at)gmail(dot)com; pgsql-es-ayuda(at)postgresql(dot)org
> Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud
> From: alvherre(at)alvh(dot)no-ip(dot)org
> To: jaquino(at)lexuseditores(dot)com
> Date: Mon, 9 Jul 2012 23:06:01 -0400
>
>
> 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.
>
> --
> Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripci�n:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda