Конвертация валют и агрегирование в базе данных PostgreSQL - PullRequest
2 голосов
/ 31 октября 2009

В нашем приложении мы храним несколько проектных фондов различных доноров, которые они вводят в соответствующей валюте, например, в евро для Германии, в шведских кронах и т. Д.

Идея состоит в том, чтобы предоставлять отчеты по этим проектам в одной валюте... В настоящее время мы храним сумму финансирования вместе с его валютой в следующей таблице:

development=> \d funding_forecasts
                                   Table "public.funding_forecasts"
   Column    |          Type          |                           Modifiers                            
-------------+------------------------+----------------------------------------------------------------
 id          | integer                | not null default nextval('funding_forecasts_id_seq'::regclass)
 project_id  | integer                | 
 year        | integer                | 
 currency    | character varying(255) | 
 payments    | integer                | 
 commitments | integer                | 

Кроме того, у нас есть таблица exchange_rates, в которой хранятся курсы обмена базовой валюты к конкретной валюте для каждого из них.год.

Теперь проблема в том, что когда мы создаем отчеты, нам нужно запросить множество таблиц финансирования для каждого проекта и, таким образом, получить огромное количество запросов + многочисленные конвертации валют и агрегации на стороне приложения..

То, что я думаю, было бы здорово, потому что Rails не очень гибок с пользовательским SQL (я знаю, что это может быть, но это хлопотно), чтобы сделать преобразование более или менее прозрачным, возможно, используя пользовательские данныетип, который позволяет легко агрегировать (используя суммы и +/- етк. операторы) .. Я все равно не уверен в этом, так что все комментарии очень ценятся!

Ответы [ 3 ]

1 голос
/ 04 января 2010

Вы видели материал tagged types Мартина ван Остерхаута?

http://svana.org/kleptog/pgsql/taggedtypes.html

0 голосов
/ 01 ноября 2009

Я думаю, вам следует добавить еще один столбец для вашей таблицы - payments_in_usd. Когда донор платит, сохраните оплаченную сумму в валюте донора, а также в долларах США на основе обменного курса по времени платежа. Для будущих обязательств вы не знаете, какой будет сумма в долларах США, но вы можете легко использовать текущий обменный курс для текущей стоимости обязательства.

Чтобы проверить, что вы ожидаете получить в долларах, просто наберите:

select sum(commitments*current_exchange_rate(currency))

Когда вы хотите узнать, сколько было заплачено, просто:

select sum(payments_in_usd)
0 голосов
/ 31 октября 2009

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

Мне кажется, что лучшим решением может быть хранение денег в одной валюте, исходя из дня, когда деньги физически конвертируются в вашу валюту. Поэтому, если донор А отправляет чек в шведских кронах, но ваша организация работает в евро, вы берете чек в банк, а они обменивают его на евро. Я бы ввел сумму, которую банк дает мне в евро.

Я знаю, что это решение не работает хорошо для обязательств для будущих пожертвований. Можно ли попросить всех сделать пожертвование в той же валюте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...