Ты хочешь хранить координаты на карте. Казалось бы, чего проще: две цифры — широта и долгота. Но как только появляется десяток точек, а потом сотня тысяч, начинаешь понимать, что обычные 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 и индексы — твои лучшие друзья.
  • Без правильной структуры БД поиск координат превратится в пытку.