Эмулирует числа с фиксированной точкой в ​​postgres? - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу использовать числа с фиксированной точкой для таблицы, всегда с 3 десятичными знаками. У меня есть пример таблицы, такой как:

create table coordinates (id serial, x integer, y integer, z integer);

Это будет иметь сотни тысяч строк, но, вероятно, не будет вставляться / обновляться очень часто после загрузки начального набора данных. Но это будет боль, если придется делать математику, чтобы разделить каждого из них на тысячу в каждом месте, где это используется. Мне пришло в голову, что представление может быть подходящим:

create view coordinates_adjusted as 
 select id, x/1000::real as x, y/1000::real as y, z/1000::real as z 
   from coordinates;

Это, конечно, работает как ожидалось, и я не ожидаю каких-либо проблем с производительностью.

Есть ли способ вставить / обновить это представление с помощью номеров с фиксированной точкой, чтобы они затем умножались на 1000, а затем вставлялись / обновлялись в базовой таблице? Postgres, кажется, поддерживает вставки в представлении, но не в тех случаях, когда представление является сложным. Хотя я не буду часто обновлять, это все равно будет происходить, и поэтому я хотел бы быть последовательным на протяжении всего проекта.

Лучше ли я использовать числовые / десятичные числа для этих столбцов? Какого рода проблемы с производительностью можно ожидать, если бы я это сделал? Мне не нужно где-то близко к этому уровню точности, и я ожидаю, что все мои данные будут хорошо вписываться в пределах значений со знаком 4 байта. Мне не нужен масштаб выше 3 или точность выше 13 или около того. Но со значениями, являющимися координатами, я буду интенсивно использовать их с математикой.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Если вам нужны значения с фиксированной запятой с тремя десятичными точками, определите столбцы как numeric(4, 3) / decimal(4, 3).

Для этого numeric. Не начинайте возиться с попытками использовать другие типы, если для ваших данных существует встроенный механизм.

0 голосов
/ 26 февраля 2020

У вас есть два варианта:

  1. Используйте numeric(10,3) повсюду для простоты кодирования и во избежание ошибок округления.

  2. Использование integer или bigint, как вы делаете сейчас для скорости обработки, за счет удобства и читабельности.

Во втором случае использование представлений с INSTEAD OF триггерами для модификации данных способ улучшить удобство (но использовать double precision, а не real), но помнить о потенциальных проблемах округления при преобразовании между целыми числами и числами с плавающей запятой.

...