sql >> Database >  >> RDS >> Mysql

Tabelstructuur voor Geo Spatial Data

Sla het op als een geometriegegevenstype . MySQL ondersteunt Geometry (generiek), evenals Point, Linestring en Polygon datatypes, zie typen ruimtelijke gegevens maken . Een enkele lengte- of breedtegraadwaarde kan op zichzelf geen geometrie zijn, zoals u deze in uw schermafbeelding hebt.

Als u de route volgt om geometrietypen te gebruiken, heeft dit twee voordelen ten opzichte van afzonderlijke velden voor breedtegraad en lengtegraad:u kunt een ruimtelijke index en je zult in staat zijn om enkele van MySQL's ruimtelijke operatorfuncties zoals ST_Buffer, ST_Intersects, ST_Distance om verdere analyse te doen. Ruimtelijke indexen zijn gebaseerd op R-trees en zullen veel beter presteren dan twee B-tree-indexen op niet-ruimtelijke kolommen, breedte- en lengtegraad -- en dit prestatieverschil zal groter worden naarmate uw tabel groter wordt.

U kunt de waarden voor breedtegraad en lengtegraad nog steeds terugkrijgen met behulp van de X- en Y-puntfuncties u verliest dus niets door uw gegevens als een punt op te slaan.

Als u uw gegevens al in twee afzonderlijke lat/lon-kolommen heeft en u wilt de route geometrie/puntgegevenstype gaan, kunt u de functie Punt gebruiken om het gegevenstype Punt te maken:

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

Merk op dat de Point-functie alleen werd geïntroduceerd in MySQL 5.1.x (het is niet al te goed gedocumenteerd, dus ik ben niet zeker van de exacte versie), en daarvoor moest je concat gebruiken met de GeomFromText-functie, zie Lat/lon tekstkolommen verplaatsen naar een kolom type 'punt' voor wat meer informatie hierover, maar merk op dat Quassnoi's antwoord lon en lat verkeerd om heeft -- het is Point(lon, lat) en niet andersom, hoewel dit een veel voorkomende fout is.

OPMERKING: Tot voor kort kon je een ruimtelijke kolom alleen indexeren als je de MyISAM-engine gebruikte.

BEWERKEN: In de komende release, MySQL 5.7 .5 , zal InnoDB eindelijk indexen op ruimtelijke gegevenstypen ondersteunen (en niet alleen ruimtelijke typen opslaan zonder een index, wat aanzienlijk minder nuttig is). Dit betekent dat u externe sleutels, ACID-garanties, ruimtelijke indexen allemaal in één engine kunt hebben, wat lang op zich heeft laten wachten.



  1. Miljoenen records invoegen van lokale naar godaddy-hosting

  2. ORA-01882:tijdzone regio niet gevonden

  3. Oracle-aliasing begrijpen - waarom wordt een alias niet herkend in een query, tenzij verpakt in een tweede query?

  4. stel een leeg wachtwoord in voor PostgreSQL-gebruiker