sql >> Base de Datos >  >> RDS >> Mysql

Estructura de tabla para datos geoespaciales

Guárdelo como un tipo de datos geométricos . MySQL admite geometría (genérica), así como tipos de datos Point, Linestring y Polygon; consulte creación de tipos de datos espaciales . Un solo valor de longitud o latitud no puede ser una geometría por sí solo, como lo tiene en su captura de pantalla.

Si sigue la ruta de usar tipos de geometría, le brinda dos ventajas sobre tener campos de latitud y longitud separados:puede agregar un índice espacial y podrá usar algunas de las funciones espaciales de MySQL. funciones de operador como ST_Buffer, ST_Intersects, ST_Distance para realizar más análisis. Los índices espaciales se basan en árboles R y funcionarán mucho mejor que dos índices de árbol B en columnas no espaciales, latitud y longitud, y esta diferencia de rendimiento crecerá a medida que crezca el tamaño de la tabla.

Todavía puede recuperar los valores de latitud y longitud usando Funciones de punto X e Y por lo que no perderá nada al almacenar sus datos como un Punto.

Si ya tiene sus datos en dos columnas separadas de latitud/longitud y desea seguir la ruta del tipo de datos de geometría/punto, puede usar la función Punto para crear el tipo de datos Punto:

alter table mytable add column pt POINT;
update mytable set pt=Point(longitude, latitude);
alter table mytable modify pt POINT NOT NULL;
create spatial index ix_spatial_mytable_pt ON mytable(pt);

Tenga en cuenta que la función Point solo se introdujo en MySQL 5.1.x (no está muy bien documentada, por lo que no estoy seguro de la versión exacta), y antes de eso tenía que usar concat con la función GeomFromText, consulte Mover columnas de texto de latitud/longitud a una columna de tipo 'punto' para obtener más información sobre esto, aunque tenga en cuenta que la respuesta de Quassnoi tiene lon y lat al revés:es Point(lon, lat) y no al revés, aunque este es un error muy común.

NOTA: Hasta hace poco, solo podía indexar una columna espacial si usaba el motor MyISAM.

EDITAR: En el próximo lanzamiento, MySQL 5.7 .5 , InnoDB finalmente admitirá índices en tipos de datos espaciales (y no solo almacenará tipos espaciales sin un índice, que es considerablemente menos útil). Esto significa que puede tener claves foráneas, garantías ACID, índices espaciales, todo en un solo motor, que ha tardado mucho en llegar.