Необходим ли тип данных валюты в финансовых приложениях? - PullRequest
2 голосов
/ 16 марта 2011

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

Предлагаемый тип данных Currency содержит сумму и тип валюты (например, USD, EUR, JPY).

Я против этого в данный момент, потому что мы использовали бы это и для типа свойства постоянных bean-компонентов.

Во-первых, он будет содержать избыточные данные. Возьмите, например, класс StockQuote, который содержит OHLC (цены открытия, максимума, минимума и закрытия) данной акции. Если бы каждый из них был представлен экземпляром Currency, тогда все OHLC имели бы ссылки на один и тот же тип валюты (например, USD). В финансовых приложениях валютные значения используются повсеместно, а не просто котировки акций, поэтому мы говорим о большой избыточности.

Во-вторых, экземпляр Currency представляет собой комбинацию из двух значений (сумма и тип валюты), поэтому вы либо полностью отбрасываете тип валюты и сохраняете только поле суммы в таблице базы данных, либо создаете тип валюты столбец в таблице для каждого свойства Currency, которое будет избыточным в таблице и нарушит 2-ую нормальную форму. В любом случае, чтение записи из таблицы обратно в объект StockQuote было бы невозможно с JPA, а в лучшем случае - с Hibernate.

Кто-нибудь сталкивался с подобными проблемами раньше? Это нормально для финансовых приложений иметь пользовательский класс валюты? Если да, то как вы реализовали это с JPA / Hibernate?

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Сущность Валюта корректно моделирует мир, обходить его нельзя.

Ваш аргумент о StockQuote не очень сильный, вы можете легко уменьшить его до 1-кратного типа валюты и до 4-х длинного целого числа.

Обновление:

@Entity
public StockQuote {
     private java.util.Currency currency; // find a nice database mapping of this, or use a ISO 4217 String instead
     private long open;
     private long close;
     private long high;
     private long low;

}

кажется достаточным для хорошего отображения базы данных.Конечно, если вы создадите служебные методы, такие как

MyCurrencyAmount currency = StockQuote.getOpenAsMyCurrencyAmount();

, тогда большая часть любых издержек будет решена.Но обратите внимание, что вам нужна как java.util.Currency (без суммы), так и ваша собственная CurrencyAmount (или любая другая), находящаяся с java.util.Currency и суммой.

1 голос
/ 16 марта 2011

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

0 голосов
/ 16 марта 2011

2-ая нормальная форма не является "святым Граалем".

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

Но если вы используете разные валюты, то вы должны хранить тип валюты для каждой денежной стоимости. Вы не можете избежать этого. Если вы это сделаете, то вы можете рассчитать в долларах США, тогда как первоначальное значение было в валюте BP или EUR. Это даст очень разные значения.

Кстати: у Java есть свой класс: java.util.Currency

...