Typy danych do przechowywania lng / lat w MySQL

14

Przechowuję dużą listę punktów lnt / lat w bazie danych MySQL. W tej chwili są to rzutowane punkty dla Wielkiej Brytanii w M, ale w perspektywie długoterminowej chciałbym upewnić się, że mogę przechowywać współrzędne punktów dla całego świata. Jakiego typu danych powinienem użyć?

Zacząłem używać decimal(18,12), ale nie byłem pewien, czy ta precyzja jest potrzebna, czy też mogę po prostu użyć float. Dołączyłem swój kod, na wypadek gdyby było jeszcze coś, co powinienem rozważyć:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Jestem całkiem nowy w SQL, więc nie jestem pewien, czy typ danych jest istotny podczas uruchamiania zapytania. Zakładałem, że ogólna pamięć będzie się różnić w zależności od typu zmiennej. Czy istnieje korzyść z zastosowania przestrzennej bazy danych w porównaniu z podstawową bazą danych MySQL do tego rodzaju pracy?

djq
źródło

Odpowiedzi:

16

To pytanie zadano również na StackOverlow .

Najlepsza odpowiedź sugeruje rozszerzenia przestrzenne MySQL . Istnieje obciążenie łącza na pracy z tymi rozszerzeniami tutaj .

Jeśli nie chcesz używać typów przestrzennych i otrzymujesz wartości z jednostki GPS lub usługi geokodowania, możesz dopasować swoją dokładność dziesiętną do źródła danych. Ogólna zasada polega na przechowywaniu danych z dokładnością do dwóch miejsc większą niż wyświetlana w aplikacji.

W przykładowym kodzie Google wyświetlającym punkty na mapie, stwierdzają one:

Tworząc tabelę MySQL, należy zwrócić szczególną uwagę na atrybuty lat i lng. Przy obecnych możliwościach powiększania w Mapach Google wystarczy dziesiętna cyfra dokładności.

Aby utrzymać minimalną ilość miejsca wymaganą dla naszej tabeli, możesz określić, że atrybuty lat i lng mają zmiennoprzecinkowe rozmiary (10,6). Pozwoli to na przechowywanie w polach 6 cyfr po przecinku plus do 4 cyfr przed przecinkiem, np. -123.456789 stopni

Nie martwiłbym się różnicami w wydajności między typami numerycznymi. Przyzwoite wskaźniki będą miały znacznie większy efekt.

geografia
źródło
+1 za dobrą odpowiedź! Tak bym powiedział i zrobił.
OptimizePrime
Dzięki za odpowiedź - przeczytałem dokumentację rozszerzeń przestrzennych MySQL, ale jak zacząć z nich korzystać? Po prostu mam domyślną bazę danych MySQL na GoDaddy; Nie wiem od czego powinienem zacząć.
djq
1
@celenius maisonbisson.com/blog/post/12147/…
geographika
1
I odpowiedź zaktualizowana z linkiem do większej liczby linków
geographika
Dlaczego 4 cyfry całkowite?
Alix Axel
6

Chyba że jesteś związany z MySQL z jakiegoś innego powodu, powinieneś naprawdę rozważyć użycie przestrzennie włączonej bazy danych, takiej jak postgis, która ma obiekt Point (i Line, Polygon itp.) Do obsługi tych szczegółów. Otrzymujesz także wsparcie projekcji, kiedy wprowadzasz tę zmianę w całym świecie.

2019 : Dla osób takich jak ja, które również nie czytają komentarzy - MySQL obsługuje typy danych przestrzennych, podobno wolniejsze, bez dowodów.

Ian Turton
źródło
Uwaga: dla tych, którzy są nowi i czytają powyższe, MySql 5.7+ działa teraz z indeksami przestrzennymi.
HopeKing
ale wciąż jest wolny
Ian Turton
Czy możesz pomóc z zasobami, które pokazują, jak wolno? Zastanawiam się nad użyciem go w projekcie z mniej niż milionem rekordów. Dzięki.
HopeKing
osobiste doświadczenie brak danych publicznych. Zbyt wiele problemów z nieprawidłowymi geometriami itp. Psującymi rzeczy
Ian Turton
Dzięki. Potrzebuję tylko odległości między punktami w oparciu o rekordy bazy danych (i żadnych skomplikowanych wymagań, takich jak Polygon) - dlatego prawdopodobnie na razie można bezpiecznie używać mysql.
HopeKing