sql >> Database >  >> RDS >> Mysql

Databasewaarden opvragen op basis van de locatie van de gebruiker

Er is een vraag die de mogelijkheden van verschillende ruimtelijke databases vergelijkt, GIS:PostGIS/PostgreSQL versus MySql versus SQL Server? , waar Postgis een vrij duidelijke winnaar is op MySQL.

Of je nu MySQL of Postgis gebruikt, je zou er veel beter aan doen, als je kunt, je breedte- en lengtegraadwaarden op te slaan als een geometrie/geografie (punt), als de functies die kunnen worden gebruikt om dingen in de buurt te vinden, ST_Distance , ST_Distance_Sphere en de meer obscure <->-operator , zie Find n Nearest Burs for gegeven Punt met behulp van PostGIS? (bijvoorbeeld gebruik) direct werken op kolommen geometrie/geografie. Wat nog belangrijker is, u kunt een ruimtelijke index . toevoegen , die deze functies nodig hebben om goed te werken, die zoekopdrachten op afzonderlijk geïndexeerde breedte- en lengtegraadkolommen met een grote marge zullen overtreffen (dit is afhankelijk van de tabelgrootte, maar zal groeien naarmate de tabelgrootte groeit),

In Postgis kun je lat en lon converteren naar een geometrie met:

alter table mytable add column geom (Geometry, 4326);
update mytable set geom = ST_SetSRID(ST_MakePoint(lon, lat), 4326)
create index ix_spatial_mytable_geom on mytable using gist(geom);

Op dit punt kunt u zeer efficiënte zoekopdrachten uitvoeren om punten in de buurt van andere punten te vinden, met behulp van een van de voorbeelden in de bovenstaande links.

U kunt vergelijkbare dingen doen in MySQL, hoewel het geen ruimtelijk referentiesysteem ondersteunt, dwz de 4326 hierboven, wat lat/lon betekent, en het mist een ST_MakePoint-functie, dus u zou STGeomFromText moeten gebruiken en de lat/ aaneenschakelen lon samen om een ​​PUNT te maken. Het doet ook alles in vlakke coördinaten, zoals Claudio en anderen hebben verklaard, wat geen probleem is met Postgis.

Mijn excuses voor een lang en enigszins tangentieel antwoord, maar na verschillende migraties tussen databases op grote hoeveelheden gegevens (MySQL, SQL Server en Postgres/GIS) te hebben gedaan en onderweg veel fouten te hebben gemaakt, hoop ik dat ik u op weg kan helpen in de in de goede richting (en voeg een beetje toekomstbestendigheid toe, als je een andere ruimtelijke functionaliteit wilt gaan gebruiken, die Postigs in schoppen heeft).



  1. Hoe NTILE() werkt in SQL Server

  2. Hoe het interval tussen twee datums in PostgreSQL te vinden

  3. Hoe dblink gebruiken (installeren) in PostgreSQL?

  4. MySQL-query optimaliseren met meerdere left joins