Mysql
 sql >> Base de données >  >> RDS >> Mysql

Structure de table pour les données géospatiales

Stockez-le en tant que type de données de géométrie . MySQL prend en charge la géométrie (générique), ainsi que les types de données Point, Linestring et Polygon, voir création de types de données spatiales . Une seule valeur de longitude ou de latitude ne peut pas être une géométrie en soi, comme vous l'avez dans votre capture d'écran.

Si vous optez pour l'utilisation de types de géométrie, cela vous donne deux avantages par rapport aux champs de latitude et de longitude séparés :vous pouvez ajouter un index spatial et vous pourrez utiliser certains des les fonctions spatiales de MySQL fonctions de l'opérateur tels que ST_Buffer, ST_Intersects, ST_Distance pour effectuer une analyse plus approfondie. Les index spatiaux sont basés sur des arbres R et fonctionneront bien mieux que deux index B-tree sur des colonnes non spatiales, la latitude et la longitude - et cette différence de performances augmentera à mesure que la taille de votre table augmentera.

Vous pouvez toujours récupérer les valeurs de latitude et de longitude en utilisant Fonctions des points X et Y vous ne perdrez donc rien en stockant vos données sous forme de Point.

Si vous avez déjà vos données dans deux colonnes lat/lon distinctes et que vous souhaitez suivre la route du type de données géométrie/point, vous pouvez utiliser la fonction Point pour créer le type de données Point :

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);

Notez que la fonction Point n'a été introduite que dans MySQL 5.1.x (elle n'est pas très bien documentée, donc je ne suis pas sûr de la version exacte), et avant cela, vous deviez utiliser concat avec la fonction GeomFromText, voir Déplacement des colonnes de texte lat/lon dans une colonne de type 'point' pour plus d'informations à ce sujet, bien que notez que la réponse de Quassnoi a lon et lat dans le mauvais sens - c'est Point (lon, lat) pas dans l'autre sens, bien que ce soit une erreur très courante.

REMARQUE : Jusqu'à récemment, vous ne pouviez indexer une colonne spatiale que si vous utilisiez le moteur MyISAM.

MODIF : Dans la prochaine version, MySQL 5.7 .5 , InnoDB prendra enfin en charge les index sur les types de données spatiales (et pas seulement stocker les types spatiaux sans index, ce qui est considérablement moins utile). Cela signifie que vous pouvez avoir des clés étrangères, des garanties ACID, des index spatiaux dans un seul moteur, ce qui a mis du temps à arriver.