Смешивая типы геометрии, стоит ли платить, когда я обращаюсь к ним позже? - PullRequest
0 голосов
/ 25 мая 2011

У меня есть таблица mysql с полем типа POLYGON, содержащая несколько полигонов, однако я обнаружил, что мне также нужно хранить ТОЧКИ.

Я бы хотел хранить геометрические типы POLYGONS и POINTS в одном поле.

Страница справочника предлагает это возможно при использовании типа данных GEOMETRY.

Есть ли какие-либо недостатки в использовании более общего типа геометрии GEOMETRY для этого? Потеряю ли я доступ к какой-либо дополнительной функциональности из-за смешивания ПОЛИГОНОВ и ТОЧЕК, когда приду к запросу этих данных на более позднем этапе?

EDITED

Чтобы прояснить мою ситуацию:

У меня есть таблица, называющая это «местоположения», каждое местоположение лучше всего будет описывать как одну ТОЧКУ или область ПОЛИГОН, но они всегда будут иметь одну или другую.

Так что структура должна напоминать:

locations:
id int
title var
single_point (POINT)
area (POLYGON)

или

locations:
id int
title var
coords (GEOMETRY)

или, как предлагается в комментариях ниже, решение с 3 таблицами?

Точки и полигоны будут в первую очередь помещаться в файлы kml для отображения на веб-картах.

Я предполагаю, что геометрические поля будут проиндексированы, чтобы наилучшим образом использовать другие запросы пространственных типов в будущем (ближайшая, наибольшая область и т. Д.).

1 Ответ

0 голосов
/ 27 мая 2011

Традиционный способ сделать это состоит в том, чтобы иметь 3 таблицы:

locations:
id int
title varchar(100)

location_points:
id int (FK to locations)
point_coords POINT

location_area:
id int (FK to locations)
poly_coords POLYGON

Затем можно создать представление, которое будет имитировать дизайн таблицы из двух столбцов:

SELECT loc.id AS id, loc.title AS title, 
       p.point_coords as single_point, a.poly_coords as area_poly
FROM locations loc
LEFT OUTER JOIN location_points p ON loc.id = p.id
LEFT OUTER JOIN location_area a on loc.id = a.id
WHERE a.id IS NOT NULL OR b.id IS NOT NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...