вторник, 15 марта 2016 г.

Тип данных box и точность ввода координат

Для работы с прямоуголниками в PostgreSQL используется тип данных box. Чтобы задать значение типа box нужно ввести две пары координат противоположных углов прямоугольника.

На картинке для наглядности представлены два прямоугольника и мы можем выполнять с ними различные операции.
Например, можем убедиться что большой прямоугольник включает в себя маленький:

postgres=# select '(4,4),(1,1)'::box @> '(3,3),(2,2)'::box;
 ?column?
----------
 t


И наоборот, маленький не включает в себя большой:

postgres=# select '(4,4),(1,1)'::box <@ '(3,3),(2,2)'::box;
 ?column?
----------
 f


Однако нужно иметь в виду, что точность ввода координат, которую понимает PostgreSQL, составляет 5 знаков после запятой. Поэтому если их синхронно уменьшить в 1 000 000 раз, то маленький прямоугольник может включать в себя большой:

postgres=# select '(0.000004,0.000004),(0.000001,0.000001)'::box
               <@ '(0.000003,0.000003),(0.000002,0.000002)'::box;
 ?column?
----------
 t


Такое некорректное поведение встречается не на всех операциях с "коробками". Но совет здесь один - при работе с прямоугольниками можно полагаться только на точность в пять знаков после запятой.

Комментариев нет: