База данных Postgres, которой я управляю, содержит множество столбцов, содержащих числа от 0 до 100, с фиксированным (никогда не более 3, обычно 2) количеством знаков после запятой. Большинство этих чисел группируются вокруг своих соответствующих средних и, таким образом, часто повторяются, что при правильной реализации может сделать их идеальными типами для индексации GIN и GIST. Это очень хорошо согласуется с нашими планами на будущее, поскольку GIN и/или GIST понадобятся для индексации определенных типов запросов, которые мы планируем реализовать в будущем. Функциональность, поставляемая с диапазонами, также будет полезна, что также станет доступны, если они были сохранены как целые числа.
В настоящее время они хранятся как числа с плавающей запятой, но в прошлом это вызывало проблемы при поиске чисел по их точному значению. Я знаю о классе NUMERIC в Postgres, но, похоже, он делает противоположное тому, что я хочу, в отношении производительности. Мы почти никогда не будем выполнять какие-либо математические операции с этими числами в Postgres, и для любой математики, которую мы делаем, она будет чрезвычайно простой, и точность не будет иметь значения. Таким образом, эти столбцы кажутся идеальными кандидатами для типов чисел с фиксированной точкой. По сути, я хочу, чтобы они хранились внутри как целые числа, но при возврате в запросах и при установке через UPDATE и INSERT десятичная точка должна перемещаться, скажем, на три знака влево.
Из того, что я читал до сих пор, я думаю, что у меня есть два варианта. Я мог бы создать триггеры для этих столбцов, чтобы манипулировать вводом и выводом значений, которые внутри были бы целочисленными типами, или я мог бы создать собственные скалярные типы в C. Второй вариант кажется лучшим, но я думаю, что если это было бы так легко сделать, кто-нибудь уже сделал бы это сейчас. Или, может быть, есть лучшее решение, которое я просто еще не встречал? Я склоняюсь к созданию пользовательского типа данных, но я все еще не уверен, есть ли веская причина этого не делать.
О, также практически все запросы к этим типам данных будут касаться того, попадают ли они в заданный диапазон. Возможно, некоторое сложение и вычитание, но очень мало умножения или деления, и, вероятно, никогда ничего более сложного, чем это. Код будет запускать только один рабочий сервер, возможно, тестовый сервер, и 4-5 компьютеров для разработки. Я не уверен, насколько это актуально, но я надеюсь, что кто-то сможет направить меня на правильный путь.