Ты хочешь хранить координаты на карте. Казалось бы, чего проще: две цифры — широта и долгота. Но как только появляется десяток точек, а потом сотня тысяч, начинаешь понимать, что обычные FLOAT или DECIMAL — это костыль.
Поэтому БД типа MySQL и PostgreSQL сделали специальные типы данных: POINT, LINESTRING, POLYGON. Они позволяют хранить координаты и сразу считать расстояния, искать ближайшее и не превращать твой SQL в кучу ручного говнокода.
1. Типы данных для координат
- POINT — точка на карте. То, что нам нужно для координат.
- LINESTRING — линия, путь, маршрут.
- POLYGON — территория, зона.
Если нужен просто поиск ближайших точек — POINT хватает.
2. Создание таблицы
MySQL:
CREATE TABLE places (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
location POINT NOT NULL
);
PostgreSQL:
CREATE TABLE places (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
location POINT NOT NULL
);
Никакой магии: id, имя, точка. Всё просто и понятно.
3. Вставка координат
MySQL:
INSERT INTO places (name, location) VALUES ('Москва', POINT(37.6176, 55.7558));
PostgreSQL:
INSERT INTO places (name, location)
VALUES ('Москва', ST_GeomFromText('POINT(37.6176 55.7558)', 4326));
Обрати внимание: в PostgreSQL нужно явно указывать SRID (4326), иначе функции геоданных работать не будут.
4. Запросы к координатам
Например, ищем ближайшие точки к Москве:
MySQL:
SELECT name, ST_Distance_Sphere(location, POINT(37.6176, 55.7558)) AS distance
FROM places
ORDER BY distance ASC;
PostgreSQL:
SELECT name, ST_Distance(location, ST_GeomFromText('POINT(37.6176 55.7558)', 4326)) AS distance
FROM places
ORDER BY distance ASC;
Сразу видишь, что POINT — это не просто пара чисел, а объект с функциями.
5. Нюансы
- Не храни координаты просто как два
FLOAT. При сотнях тысяч точек функции поиска будут тормозить. - SRID — важная штука. Если забудешь, PostGIS будет считать расстояния как-то странно.
- Для больших баз ставь индексы типа
SPATIAL(MySQL) илиGIST(PostgreSQL). Без этого ближайшие объекты искать — пытка.
Заключение
Хранение точек на карте — это не про “две цифры и готово”. POINT и географические типы данных экономят кучу времени, а функции вроде ST_Distance позволяют делать поиск рядом без костылей.
Итог:
- POINT для точек, LINESTRING для маршрутов, POLYGON для зон.
- SRID и индексы — твои лучшие друзья.
- Без правильной структуры БД поиск координат превратится в пытку.
0 комментариев