[l-desarrollo] Como consultar esto correctamente...

3 views
Skip to first unread message

Alexis Sanchez

unread,
Jun 9, 2012, 11:42:05 PM6/9/12
to Aplicaciones y Desarrollo en Linux
Saludos amigos estoy trabajando en una actualizacion de una aplicación
para telefonos mobiles, de una empresa de gestión de cobros, el
sistema esta diseñado originalmente en php&mysql puro, estoy
considerando o llevarlo a algun frameworkphp o llevarlo a django u
otra cosa quizas... pero ese no es el problema, una de las funciones
del sistema es que basado a la ubicacion (proporcionada manualmente
por el usuario, en latitud y longitud), debe mostrar un listado de los
clientes mas cercanos, mediante un calculo matematico y ordenar por
distancia...

Esto lo hace el sistema extrayendo TODOS los clientes, con sus
coordenadas, haciendo el calculo matemático contra las coordenadas
proporcionadas por el usuario y ordenando la data con un algoritmo
algo extraño, (pero funciona), la verdad este metodo aunque funcional,
por ahora a largo plazo no es viable, ya que por ahora el sistema se
ejecuto en una ciudad piloto pero comenzara a ser exportado a varias
ciudades, y hacer esta consulta seria demasido trabajo, cuando la data
cresca mucho...

Entonces el problema es que tampoco se me ocurre una forma mas
eficiente de hacer esto, estuve pensando en usar procedimientos
almacenados, en mysql pero no se si este sea el metodo mas efectivo
para esto, alguna sugerencia?

--
Alexis Sanchez
0416-2584008
Linux Counter User: 484046
http://about.me/aasanchez
Ubuntu 11.10 & Kernel: 3.0.0-16-generic
Twitter: @aasanchez
facebook: facebook.com/aasanchez
_______________________________________________
l-desarrollo mailing list
l-desa...@velug.org.ve
http://listas.velug.org.ve/mailman/listinfo/l-desarrollo

Luis Hernandez

unread,
Jun 10, 2012, 12:31:18 AM6/10/12
to Aplicaciones y Desarrollo en Linux
Saludos, yo trataría de dejarle todo ese trabajo a la base de datos, por supuesto usando las funcionalidades "espaciales" (spatial) de en este caso mysql..

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

Aunque por lo poco que leí, mysql no es muy bueno haciendo este trabajo, por esto te recomiendo investigar o tratar de irte por la opción de Postgis (http://postgis.refractions.net/), que aunque realmente no necesitas manejar un servidor Gis como tal, necesitas sus funcionalidades de cálculo espacial, y creo que PostGis podría servirte.

Atte.
--
Ing. Luis Hernández
Ingeniero en Computación
Ubuntu 11.10 / Debian squeeze
lue...@gmail.com
http://cyberrevolucionario.blogspot.com/
@luelher
0424-5558074
0416-5013339
Usuario Linux Nro 429461

Ernesto Hernández-Novich

unread,
Jun 10, 2012, 11:10:12 AM6/10/12
to Aplicaciones y Desarrollo en Linux
On Sat, 2012-06-09 at 23:12 -0430, Alexis Sanchez wrote:
> Saludos amigos estoy trabajando en una actualizacion de una aplicación
> para telefonos mobiles, de una empresa de gestión de cobros, el
> sistema esta diseñado originalmente en php&mysql puro, estoy
> considerando o llevarlo a algun frameworkphp o llevarlo a django u
> otra cosa quizas... pero ese no es el problema, una de las funciones
> del sistema es que basado a la ubicacion (proporcionada manualmente
> por el usuario, en latitud y longitud), debe mostrar un listado de los
> clientes mas cercanos, mediante un calculo matematico y ordenar por
> distancia...
[...]

> Entonces el problema es que tampoco se me ocurre una forma mas
> eficiente de hacer esto, estuve pensando en usar procedimientos
> almacenados, en mysql pero no se si este sea el metodo mas efectivo
> para esto, alguna sugerencia?

PostgreSQL tiene al menos una década siendo ampliamente superior a MySQL
en todo, y en particular en el manejo de información geométrica y
geográfica. No solamente cuenta con tipos de datos *nativos* [1] y
funciones para manipularlos [2], sino que además cuenta con métodos de
índice que fueron diseñados precisamente para permitir el ordenamiento
eficiente de los mismos. Eso sin contar que existe una extensión [3]
específica para gestión de información geográfica que seguramente ya
tiene resuelto todo lo que en esa aplicación reinventaron, y el resto de
las cosas que todavía no han enfrentado y que eventualmente tendrían que
enfrentar.

Escribir funciones de cálculo numérico *no* es un ejercicio simple, y
mucho menos recomendable en un lenguaje tan lento y con poca precisión
como PHP. Si quieres mejorar tus oportunidades de escalabilidad, deja
PHP para lo que más o menos sirve como gestor de plantillas, y deja que
el manejo de datos complejos los haga una base de datos pensada desde el
principio para manejar datos multidimensionales.

[1] http://www.postgresql.org/docs/9.1/static/datatype-geometric.html
[2] http://www.postgresql.org/docs/9.1/static/functions-geometry.html
(aunque cualquier versión desde 7.0 en adelante las tiene)
[3] http://postgis.refractions.net/
--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

Ernesto Hernández-Novich

unread,
Jun 10, 2012, 11:29:41 AM6/10/12
to Aplicaciones y Desarrollo en Linux
On Sun, 2012-06-10 at 00:01 -0430, Luis Hernandez wrote:
> Saludos, yo trataría de dejarle todo ese trabajo a la base de datos,
> por supuesto usando las funcionalidades "espaciales" (spatial) de en
> este caso mysql..
>
> http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

Esta extensiones son precarias.

Para comenzar, los tipos de datos provistos representan un subconjunto
muy pequeño de todas las operaciones geométricas y geográficas que uno
quisiera hacer, y se termina escribiendo el resto en la aplicación. Mala
idea en ambos extremos.

Por otro lado, sólo proveen soporte a índices basados en R-Trees
cuadráticos [1], mientras que PostgreSQL provee índices GiST que son un
superconjunto de los R-Trees, con desempeño igual o superior. Se podría
argumentar que los R-Trees son suficientes para el pequeño conjunto de
cosas que MySQL provee y "para qué quiero más", pero es importante notar
que los índices espaciales de MySQL sólo funcionan en modo MyISAM (o
sea, no transaccional) reduciendo *automáticamente* la escalabilidad del
conjunto de datos con el cual podrás trabajar si pretendes alta
concurrencia.

MySQL no está en la misma liga que PostgreSQL, y en el caso de
almacenar, procesar y ordenar información geométrica/geográfica, hay un
abismo notable.

[1] Valga comentar que es sabido que los R*-trees (como los que *usaba*
PostgreSQL) son superiores a los R-trees cuadráticos de Guttman.


--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

_______________________________________________

Alexis Sanchez

unread,
Jun 10, 2012, 11:50:52 AM6/10/12
to emhn...@gmail.com, Aplicaciones y Desarrollo en Linux
Ya con esto se que al menos la base de datos la migrare a PostgreSQL,
tenia esto considerado por razones de escalabilidad a futuro y creo
que sera lo mas recomendable, así como dices Ernesto quitarle todo el
peso al pobre PHP, asi, si tengo que también migrar el lenguaje de
programación, sera mucho mas simple, y las consultas seran mucho mas
eficientes...

Ahora toca entender el uso de PostGIS, muchas gracias por la ayuda..
estare comentando los avances



2012/6/10 Ernesto Hernández-Novich <emhn...@gmail.com>:
--
Alexis Sanchez
0416-2584008
Linux Counter User: 484046
http://about.me/aasanchez
Ubuntu 11.10 & Kernel: 3.0.0-16-generic
Twitter: @aasanchez
facebook: facebook.com/aasanchez

Werner Echezuria

unread,
Jun 11, 2012, 10:07:58 AM6/11/12
to Aplicaciones y Desarrollo en Linux
Buenos Días Alexis, te voy a comentar de un proyecto en el que
participé, tal vez sea lo que necesitas y es algo muy sencillo de
hacer.

El año pasado desarrollé una aplicación móvil en Ruby on Rails y un
framework javascript llamado Sencha Touch, el sistema tenia una base
de datos de clientes en donde (usando Google maps) el sistema
determinaba la ubicación del usuario (usando la api de Google) y
almacenaba en base de datos la latitud y longitud de la persona que
ingresaba al sistema. Luego el usuario final, dependiendo de donde se
encontrara físicamente, el sistema a través del móvil le indicaba
donde se ubicaban los clientes más cercanos.

Tal vez puedas usar la api de Google Maps para lograr lo que
necesitas, de forma sencilla y sin complicarte mucho la vida.

Saludos.

Alexis Sanchez

unread,
Jun 11, 2012, 11:29:19 AM6/11/12
to Aplicaciones y Desarrollo en Linux
Es una opcion interesante, podrias darme mas información?... Aunque el
problema de usar google maps, es usar google maps, estaba considerando
migrar a OSM por la fialidad de su data..

2012/6/11 Werner Echezuria <wer...@gmail.com>:

Werner Echezuria

unread,
Jun 11, 2012, 6:29:19 PM6/11/12
to Aplicaciones y Desarrollo en Linux
Según mi experiencia Google maps es bastante confiable (no sé si a
alguien le haya resultado un problema). La ventaja es que puedes usar
javascript (de esta forma el backend puedes programarlo en Ruby,
Python o PHP) y es bastante sencillo de usar, hay mucha ayuda en
Google para lograr lo que necesites, en el siguiente link puedes ver
un hola mundo y bastante ayuda para usar la API:

https://developers.google.com/maps/documentation/javascript/tutorial?hl=es
Reply all
Reply to author
Forward
0 new messages