sql >> Database teknologi >  >> RDS >> Mysql

Tabelstruktur for Geo Spatial Data

Gem det som en geometridatatype . MySQL understøtter geometri (generisk) såvel som punkt-, linjestreng- og polygondatatyper, se oprettelse af geodatatyper . En enkelt længde- eller breddegradsværdi kan ikke være en geometri alene, som du har det på dit skærmbillede.

Hvis du går vejen med at bruge geometrityper, giver det dig to fordele i forhold til at have separate bredde- og længdegradsfelter:du kan tilføje en rumligt indeks og du vil være i stand til at bruge nogle af MySQL's rumlige operatørfunktioner såsom ST_Buffer, ST_Intersects, ST_Distance for at udføre yderligere analyse. Rumlige indekser er baseret på R-træer og vil klare sig langt bedre end to B-træer indekser på ikke-rumlige kolonner, breddegrad og længdegrad -- og denne præstationsforskel vil vokse, efterhånden som din tabelstørrelse vokser.

Du kan stadig få værdierne for breddegrad og længdegrad tilbage ved at bruge X- og Y-punktsfunktioner så du vil ikke miste noget ved at gemme dine data som et punkt.

Hvis du allerede har dine data i to separate lat/lon kolonner, og du ønsker at gå geometri/punkt datatype-ruten, kan du bruge punktfunktionen til at oprette punktdatatypen:

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

Bemærk, at Point-funktionen kun blev introduceret i MySQL 5.1.x (den er ikke for godt dokumenteret, så jeg er ikke sikker på den nøjagtige version), og før det skulle du bruge concat med GeomFromText-funktionen, se Flytning af lat/lon tekstkolonner til en kolonne af typen "punkt" for mere information om dette, men bemærk, at Quassnois svar har lon og lat den forkerte vej rundt -- det er Point(lon, lat) ikke den anden vej, selvom dette er en meget almindelig fejl.

BEMÆRK: Indtil for nylig kunne du kun indeksere en rumlig kolonne, hvis du bruger MyISAM-motoren.

EDIT: I den kommende udgivelse, MySQL 5.7 .5 , vil InnoDB endelig understøtte indekser på geodatatyper (og ikke kun gemme rumlige typer uden et indeks, hvilket er betydeligt mindre nyttigt). Det betyder, at du kan have fremmednøgler, ACID-garantier, rumlige indekser alt sammen i én motor, hvilket har været længe undervejs.



  1. Hvor meget reel lagerplads bruges med en varchar(100)-deklaration i mysql?

  2. Oracle-låse og bordlåse:Sådan fungerer det

  3. Sådan overføres brugerdefineret type-array til Postgres-funktionen

  4. Kan jeg bruge flere markører på én forbindelse med pyodbc og MS SQL Server?