sql >> Databasteknik >  >> RDS >> Mysql

Fråga databasvärden baserat på användarens plats

Det finns en fråga som jämför kapaciteten hos olika rumsliga databaser, GIS:PostGIS/PostgreSQL vs. MySql vs. SQL Server? , där Postgis kommer ut som en ganska klar vinnare över MySQL.

Oavsett om du använder MySQL eller Postgis, skulle du vara mycket bättre, om du kan, lagra dina latitud- och longitudvärden som en geometri/geografi (Point), som de funktioner som kan användas för att hitta saker i närheten, ST_Distance , ST_Distance_Sphere och den mer obskyra <-> operatorn , se Hitta n närmaste grannar för given Point med PostGIS? (till exempel användning) arbeta direkt på kolumner för geometri/geografi. Ännu viktigare är att du kan lägga till ett spatialt index , som dessa funktioner behöver för att fungera korrekt, vilket kommer att överträffa sökningar på separat indexerade latitud- och longitudkolumner med stor marginal (detta beror på tabellstorleken, men kommer att växa när tabellstorleken växer),

I Postgis kan du konvertera lat och lon till en geometri med:

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

Vid det här laget kommer du att kunna göra mycket effektiva frågor för att hitta punkter nära andra punkter, med hjälp av något av exemplen i länkarna ovan.

Du kan göra liknande saker i MySQL, även om det inte stöder ett rumsligt referenssystem, dvs 4326 ovan, vilket betyder lat/lon, och det saknar en ST_MakePoint-funktion, så du skulle behöva använda STGeomFromText och sammanfoga lat/ lon tillsammans för att göra en PUNKT. Den gör också allt i plana koordinater, som Claudio och andra har sagt, vilket inte är ett problem med Postgis.

Jag ber om ursäkt för ett långt och något tangentiellt svar, men efter att ha gjort olika migreringar mellan databaser på stora datamängder (MySQL, SQL Server och Postgres/GIS) och gjort massor av misstag på vägen, hoppas jag att jag kan sätta dig igång i rätt riktning (och lägg till lite framtidssäkring om du vill börja använda någon annan rumslig funktionalitet, som Postigs har i spader).



  1. Konvertera ett månadsnummer till månadsnamnet i SQL Server (T-SQL)

  2. Hur upprätthåller man referensintegritet på enkelbordsarv?

  3. Uppdaterar MySQL primärnyckel

  4. Hur man infogar stora mängder data i sqlite-databasen i Android