2011-03-16 54 views
2

我們正在開發一個股票交易應用程序,並討論是否應該爲貨幣引入數據類型。金融應用程序中必需的貨幣數據類型?

提議的Currency數據類型包含貨幣數量和類型(例如USD,EUR,JPY)。

我現在反對它,因爲我們也將它用於持久性bean的屬性類型。

首先,它會包含redudant數據。以StockQuote類爲例,其中包含給定庫存的OHLC(開盤價,最高價,最低價和收盤價)。如果它們中的每一個都由Currency實例表示,那麼所有的OHLC都會引用相同的貨幣類型(例如USD)。在金融應用中,貨幣價值被廣泛使用,而不僅僅是股票報價,所以我們談論的是大量的冗餘。

其次,Currency實例是兩個值(金額和貨幣類型)的組合,所以你要麼完全下降的貨幣類型,並且只有量字段存儲在數據庫中的表或創建一個貨幣類型列在表中爲每個Currency屬性,這在表中是多餘的,並且打破第二範式。無論哪種方式,從表中讀取一條記錄返回到StockQuote對象將是不可能的與JPA和棘手的Hibernate最好。

以前有人遇到過類似的問題嗎?金融應用程序擁有自定義貨幣類別是否正常?如果是這樣,你是怎麼用JPA/Hibernate實現它的?

+0

使用java.math.BigDecimal或者可能派生自己的基於它的類(使用組合不繼承),但不需要重新發明輪子。 – GriffeyDog 2011-03-16 16:21:08

回答

1

值得注意的是,股票並非總是以普通貨幣報價。例如倫敦證券交易所的股票以便士報價,而不是英鎊。交易所中的所有股票都將以相同的貨幣單位進行報價,因此您可以假設對於特定交易所的特定股票,您知道貨幣是什麼,從而使貨幣變得多餘。所有你需要的是價格。

0

第二範式不是「聖盃」。

有時候最好打破它。 您正在使用財務應用程序。擁有相同的價格是非常重要的。如果數據庫中的所有數據具有相同的貨幣,那麼是的,這不是必需的。

但是,如果您使用不同的貨幣,那麼您必須存儲每種貨幣價值的貨幣類型。你無法避免它。如果你這樣做,那麼你最終可以用美元計算,而原始價值是用BP或EUR。這會給出非常不同的價值。

順便說一句:Java有它自己的類:它周圍java.util.Currency

+1

確實如此,但java.util.Currency沒有數量字段,因此自定義類會將該類加上數量字段。 – 2011-03-16 16:35:38

1

的貨幣實體模型世界正確,也沒有去。

你對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和金額。

+0

你是否建議結合java.util.Currency字段和雙字段的自定義類不是必需的呢? – 2011-03-16 16:39:01

+0

我不會建議貨幣/金錢的雙'字段,但'BigDecimal' – 2011-03-16 16:50:35

+0

@ TheEliteGentleman,我猜你不是指BigDecimal而是BigInteger?那麼我會在任何一天與本機類型整數(無逗號!)。所以不要模擬美元,模型美分。 – ThomasRS 2011-03-16 17:01:44